fmdb实现sqlite数据库的增删改查功能(下)

上一篇文章介绍了使用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的问题 。

猜你喜欢

转载自blog.csdn.net/bluecat_1128/article/details/69815601