FMDB多线程下"iscurrentlyinuse"或者"databaseislocked"问题

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

问题一: "is currently in use" 出现的场景是这样的,多线程操作数据库,每个线程都使用了FMDatabase实例(注意没有使用FMDatabaseQueue)。

问题二:“database is locked"出现的场景是这样的,多线程操作数据库,每个线程各自创建了FMDatabaseQueue实例操作数据库,或者一个线程创建FMDatabaseQueue实例来操作,而另外的线程创建了FMDatabase实例来操作。

解决:FMDB多线程操作数据库,必须使用FMDatabaseQueue,必须只创建一个实例,也就是多个线程操作数据库的是同一个FMDatabaseQueue实例。

原因:因为首先FMDatabase是不具备线程安全的,如果两个线程中同时操作数据库,就会"is currently in use" ;FMDatabasequeue其实是一个调度队列(G-C-D),数据库的操作必须是顺序执行,不能两个数据库的操作同时执行,如果是两个线程各自创建了FMDatabaseQueue的实例,线程同时执行时,就会出现相同的数据库操作同时触发,导致”database is locked“,所以必须是一个FMDatabaseQueue实例下,多个线程下同时操作,其实是在排在同一个队列中逐一操作的,没有同时操作。

PS:以下就是我的解决方式

1#PRagmamark - 配置数据库单聊2+(FMDatabaseQueue *)getSharedDatabaseQueue3{4staticFMDatabaseQueue *my_FMDatabaseQueue=nil;56if(!my_FMDatabaseQueue) {7NSString *path = [kDocuments stringByAppendingPathComponent:@"db_CMBCC.sqlite"];8my_FMDatabaseQueue =[FMDatabaseQueue databaseQueueWithPath:path];9}10returnmy_FMDatabaseQueue;11}

- (void)SaveSingleChatMessage:(MessageEntityModel *)messageEntity

{

FMDatabaseQueue *queue = [StoreManagerHelper getSharedDatabaseQueue];

[queue inDatabase:^(FMDatabase *db) {

//打开数据库

if ([db open]) {

//数据库建表,插入语句

}

else

{

NSLog(@"打开数据库失败!");

}

}];

}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航