目标c中的sqlite3多线程

时间:2012-05-08 02:58:38

标签: iphone objective-c ios multithreading sqlite

我在我的应用程序中使用dispatch_async运行后台线程,有时我的主线程和后台线程同时访问数据库,这给了我一个数据库错误,我尝试使用sqlite3_threadsafe()来解决它总是返回2即,我不能在两个线程中使用相同的数据库连接,我希望它返回1可以任何人在这方面帮助我

2 个答案:

答案 0 :(得分:4)

我认为你正在采取错误的做法。无论你如何编译它,SQLite都不是可靠的线程安全的 - 参见the FAQ。即使SQLite是为了线程安全而编译的,如果任何事务处于挂起状态或者任何语句仍未完成,则可能无法从多个线程使用相同的数据库。

以上建议使用Grand Central Dispatch将所有SQLite访问权限汇集到一个串行调度队列中是我认为正确的方法,尽管我更有可能建议您创建自己的队列而不是使用主队列,原因很简单,当你想等待结果时,你可以可靠地调度.sse。

答案 1 :(得分:1)

您可以添加所有访问语句,因此在访问sqlite商店时,您始终位于主线程上。

dispatch_async(dispatch_get_main_queue(), ^ {
    //code goes here
});