FMDB多线程下"is currently in use" 或者 "database is locked" 问题_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > FMDB多线程下"is currently in use" 或者 "database is locked" 问题

FMDB多线程下"is currently in use" 或者 "database is locked" 问题

 2014/11/6 10:42:15  悠漠漠  程序员俱乐部  我要评论(0)
  • 摘要:问题一:"iscurrentlyinuse"出现的场景是这样的,多线程操作数据库,每个线程都使用了FMDatabase实例(注意没有使用FMDatabaseQueue)。问题二:“databaseislocked"出现的场景是这样的,多线程操作数据库,每个线程各自创建了FMDatabaseQueue实例操作数据库,或者一个线程创建FMDatabaseQueue实例来操作,而另外的线程创建了FMDatabase实例来操作。解决:FMDB多线程操作数据库
  • 标签:多线程 问题 database ASE 线程

问题一: "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 #pragma mark - 配置数据库单聊
 2 +(FMDatabaseQueue *)getSharedDatabaseQueue
 3 {
 4     static FMDatabaseQueue *my_FMDatabaseQueue=nil;
 5     
 6     if (!my_FMDatabaseQueue) {
 7         NSString *path = [kDocuments stringByAppendingPathComponent:@"db_CMBCC.sqlite"];
 8         my_FMDatabaseQueue = [FMDatabaseQueue databaseQueueWithPath:path];
 9     }
10     return my_FMDatabaseQueue;
11 }
class="brush:objc;gutter:true;">- (void)SaveSingleChatMessage:(MessageEntityModel *)messageEntity
{
    FMDatabaseQueue *queue = [StoreManagerHelper getSharedDatabaseQueue];
    [queue inDatabase:^(FMDatabase *db) {
    //打开数据库
    if ([db open]) {

      //数据库建表,插入语句   
   
    }
        else
        {
            NSLog(@"打开数据库失败!");
        }

    }];
}

 

发表评论
用户名: 匿名