xcode - iOS FMDB 多线程存取数据库问题

查看:145
本文介绍了xcode - iOS FMDB 多线程存取数据库问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

对于FMDB我已经有点摸不透了.
我的读数据操作,写在子线程里,增删改操作写在主线程里,遇到了一个问题,就是有可能会数据库被锁,然后增删改操作失败,我也尝试过写回滚,但是都是失败的.我看了FMDB的相关多线程内容,都没有一个明确的答案,有了解这块的吗?
写法是:

-(NSArray *)list{
    
    NSString *path = [[PathHelper cachePath] stringByAppendingString:@"/MessagesCache.db"];
    FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
    NSMutableArray *list = [NSMutableArray array];
    [queue inDatabase:^(FMDatabase *db) {
        [db open];
        FMResultSet *set = [db executeQuery:@"SELECT * FROM t_messagesCache ORDER BY triggerTime ASC;"];
        
        while (set.next) {
            
            MXNIMMessageModel *message = [MXNIMMessageModel new];
            message.msgType = [set intForColumn:@"msgType"];
            message.uid = [set stringForColumn:@"uid"];
            message.msg = [set stringForColumn:@"msg"];
            message.nickname = [set stringForColumn:@"nickname"]; ;
            message.name = [set stringForColumn:@"name"];
            message.url = [set stringForColumn:@"url"];
            message.ext = [set stringForColumn:@"ext"];
            message.dur = [set intForColumn:@"dur"];
            message.w = [set intForColumn:@"w"];
            message.h = [set intForColumn:@"h"];
            message.size = [set intForColumn:@"size"];
            message.lastInterval = [set intForColumn:@"lastInterval"];
            message.md5 = [set stringForColumn:@"md5"];
            message.sort = [set intForColumn:@"sort"];
            message.triggerTime = [set stringForColumn:@"triggerTime"];
            message.teamId = [set stringForColumn:@"teamId"];
            
            [list addObject:message];
            
        }
        [db close];
        
    }];
    return list;
}

- (BOOL)deleteMessageModelByUid:(NSString *)uid
{

    __block BOOL result;
    NSString *path = [[PathHelper cachePath] stringByAppendingString:@"/MessagesCache.db"];
    FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
    [queue inDatabase:^(FMDatabase *db) {
        [db open];
        result = [db executeUpdateWithFormat:@"DELETE FROM t_messagesCache WHERE uid = %@",uid];
        [db close];
    }];
    
    return result;
    
}

解决方案

是不是FMDatabaseQueue *queue 应该设为全局的啊 增删改查都用同一个queue

这篇关于xcode - iOS FMDB 多线程存取数据库问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆