在我的应用程序中,后台sqlite线程正在运行...在后台线程中,它从Web服务中获取数据并将数据插入或更新到数据库中。如果用户从前台插入或删除数据,有时我会崩溃,它显示“sqlite dblocked”。但不会返回sqlite繁忙错误。

我测试了线程安全模式

     NSLog(@" sqlite3_threadsafe() = %d", sqlite3_threadsafe());

它显示线程安全为2。

我想检查是否有其他db正在写数据,如果db正在写数据..我想在先前的写任务完成后写数据。

如何处理这些情况..

最佳答案

您可以使用锁(例如《线程编程指南》的Synchronization部分中列举的锁),也可以使用专用的串行队列。例如,创建一个队列:

@property (nonatomic, strong) dispatch_queue_t databaseQueue;

实例化它:
self.databaseQueue = dispatch_queue_create("com.company.app.database", 0);

每当您想与数据库进行交互时,您都可以
dispatch_sync(self.databaseQueue, ^{
    // do your database activity here
});

如果您想简化生活,FMDB库中有一个 FMDatabaseQueue 对象,它可以为您完成很多工作(并且通常可以大大简化数据库的交互)。

10-07 19:14
查看更多