我正在尝试确定我对数据库的 sqlite 访问是否在 iOS 上是线程安全的。我正在编写一个非 App Store 应用程序(或者可能是一个启动守护程序),因此 Apple 的批准不是问题。有问题的数据库是内置的sms.db,所以操作系统肯定也在访问这个数据库进行读写。我只想能够安全地阅读它。
我读过这篇关于使用 sqlite 从多个进程中读取的内容:
多个进程可以同时打开同一个数据库。多个进程可以同时执行 SELECT。但是,任何时候只有一个进程可以对数据库进行更改。
我知道线程安全可以从 sqlite 编译出来,并且sqlite3_threadsafe()
可以用来测试这一点。在 iOS 5.0.1 上运行
int safe = sqlite3_threadsafe();
结果为 2。 据此,这意味着互斥锁是可用的。但是,这并不一定意味着它正在使用中。
我并不完全清楚线程安全是否在每个连接、每个数据库或全局基础上动态启用。
我也读过这个。看起来sqlite3_config()
可以用来启用安全的多线程,但当然,我无法控制或了解操作系统本身可能如何使用此调用(是吗?)。如果我要在我的应用程序中再次进行该调用,是否可以安全地读取数据库,或者它是否只会解除我的应用程序中使用相同sqlite3
数据库句柄的多个线程的并发访问冲突?
无论如何,我的问题是...
我可以安全地读取这个也被 iOS 访问的数据库吗?如果可以,如何?