上一篇文章介绍了使用fmdb框架中的FMDatabase直接操作sqlite数据库,实现数据库的增删改查功能。但是前边说到了如果是多线程访问数据库使用此类的话会造成工程crash,所以引出了此篇文章重点介绍的FMDatabaseQueue类,此类是线程安全的,可以实现多线程的访问
FMDatabaseQueue的使用方法简单介绍
1、创建全局的FMDatabaseQueue实例,并进行实例化
// 懒加载数据库队列
- (FMDatabaseQueue *)queue {
if (_queue == nil) {
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"userque.sqlite"];
_queue = [FMDatabaseQueue databaseQueueWithPath:filePath];
}
return _queue;
}
2、创建对应的表userInfo,表中的字段依然为主键id,userid, name, age, sex, height, weight7个字段。使用FMDatabaseQueue操作数据库开发者不用手动进行数据库的打开关闭操作。
// 创建表
- (BOOL)createTable{
__block BOOL result;
// 创建表
[self.queue inDatabase:^(FMDatabase *db) {
result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS userInfo(id integer PRIMARY KEY, userid text NOT NULL, name text NOT NULL, age integer, sex integer, height integer, weight integer);"];
}];
return result;
}
3、插入数据,传入字典,字典中存储的是一个用户的信息
// 插入数据
- (BOOL)inserUserInfoWithDict:(NSDictionary *)userDict{
__block BOOL result;
[self.queue inDatabase:^(FMDatabase *db) {
result = [db executeUpdateWithFormat:@"INSERT INTO userInfo(userid,name,age,sex,height,weight) VALUES(%@,%@,%ld,%ld,%ld,%ld)",userDict[@"userid"], userDict[@"name"], [userDict[@"age"] integerValue], [userDict[@"sex"] integerValue], [userDict[@"height"] integerValue], [userDict[@"weight"] integerValue]];
}];
return result;
}
4、根据对应的userid查询对应的用户信息
// 查询用户信息
- (NSMutableArray *)queryUserInfoWithUserid:(NSString *)userid{
NSMutableArray *userArr = [NSMutableArray array];
[self.queue inDatabase:^(FMDatabase *db) {
FMResultSet *resultSet = [db executeQueryWithFormat:@"SELECT * FROM userInfo WHERE userid=%@", userid];
while ([resultSet next]) {
NSString *name = [resultSet stringForColumn:@"name"] ? : @"";
NSInteger age = [resultSet intForColumn:@"age"];
NSInteger sex = [resultSet intForColumn:@"sex"];
NSInteger height = [resultSet intForColumn:@"height"];
NSInteger weight = [resultSet intForColumn:@"weight"];
NSDictionary *userDict = @{@"userid":userid, @"name":name, @"age":@(age), @"sex":@(sex), @"height":@(height), @"weight":@(weight)};
[userArr addObject:userDict];
}
}];
return userArr;
}
5、修改对应userid用户的个人信息
// 修改用户信息
- (BOOL)updateUserInfo:(NSDictionary *)userDict userid:(NSString *)userid{
__block BOOL result;
[self.queue inDatabase:^(FMDatabase *db) {
NSString *name = userDict[@"name"] ? : @"";
NSInteger age = [userDict[@"age"] integerValue];
NSInteger sex = [userDict[@"sex"] integerValue];
NSInteger height = [userDict[@"height"] integerValue];
NSInteger weight = [userDict[@"weight"] integerValue];
NSString *sq = [NSString stringWithFormat:@"UPDATE userInfo SET name='%@', age='%ld', sex='%ld', height='%ld', weight='%ld' WHERE userid='%@'", name, age, sex, height, weight, userid];
result = [db executeUpdate:sq];
}];
return result;
}
6、删除对应userid的用户
// 删除用户信息
- (BOOL)deleteUserInfoWithId:(NSString *)userid{
__block BOOL result;
[self.queue inDatabase:^(FMDatabase *db) {
NSString *sq = [NSString stringWithFormat:@"delete from userInfo where userid='%@'",userid];
result = [db executeUpdate:sq];
}];
return result;
}
结尾
以上为利用FMDatabaseQueue对sqlite数据库进行操作的方法,可以实现数据库的增删改查功能,以上的方法都可以在多线程中调用,也可以跨线程使用,所以就解决了上一遍文章说到的多线程访问数据库时造成crash的问题 。