如何处理多线程访问sqlite3没有dblocked错误

ban*_*anu 5 sqlite multithreading ios

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

我测试了线程安全模式

     NSLog(@" sqlite3_threadsafe() = %d", sqlite3_threadsafe());
Run Code Online (Sandbox Code Playgroud)

它显示线程安全是2.

我想检查是否有其他数据库正在写数据,如果db正在写数据..我想在上一个写任务完成后写数据.

如何处理这些情况..

Rob*_*Rob 9

您可以使用锁(例如" 线程编程指南"的" 同步"部分中列出的那些),也可以使用专用的串行队列.例如,创建一个队列:

@property (nonatomic, strong) dispatch_queue_t databaseQueue;
Run Code Online (Sandbox Code Playgroud)

实例化:

self.databaseQueue = dispatch_queue_create("com.company.app.database", 0);
Run Code Online (Sandbox Code Playgroud)

无论何时你想与数据库进行交互,你都可以做到

dispatch_sync(self.databaseQueue, ^{
    // do your database activity here
});
Run Code Online (Sandbox Code Playgroud)

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


CL.*_*CL. 2

线程安全模式可以防止多个线程访问同一个连接时崩溃,但无法防止多个连接相互干扰。

您应该使用公共锁来保护所有数据库事务;使用互斥体或@synchronized 指令。