3

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

4

2 回答 2

4

我认为你正在追求错误的方法。无论您如何编译 SQLite,它都不是可靠的线程安全的——请参阅常见问题解答。即使 SQLite 是为线程安全而编译的,如果任何事务未决或任何语句仍未完成,则可能无法从多个线程使用同一数据库。

上面关于使用 Grand Central Dispatch 将所有 SQLite 访问汇集到串行调度队列中的建议在我看来是正确的方法,尽管我更有可能建议您创建自己的队列而不是使用主队列当您想要等待结果时,您可以可靠地 dispatch_sync 的简单原因。

于 2012-05-08T03:17:38.743 回答
1

您可以将所有访问语句添加到,因此在访问 sqlite 存储时您始终在主线程上。

dispatch_async(dispatch_get_main_queue(), ^ {
    //code goes here
});
于 2012-05-08T03:15:56.577 回答