对于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