我正在尝试确定我的sqlite访问数据库是否在iOS上是线程安全的.我正在编写一个非App Store应用程序(或可能是一个启动守护程序),因此Apple的批准不是问题.有问题的数据库是内置的sms.db,因此操作系统也可以访问此数据库进行读写.我只想安全地阅读它.
我已经阅读过有关使用sqlite从多个进程读取的内容:
多个进程可以同时打开同一个数据库.多个进程可以同时执行SELECT.但是,只有一个进程可以随时对数据库进行更改.
我知道线程安全性可以用sqlite编译,并且sqlite3_threadsafe()可以用来测试它.在iOS 5.0.1上运行此功能
int safe = sqlite3_threadsafe();
Run Code Online (Sandbox Code Playgroud)
产生的2的结果 根据本,这意味着互斥锁定是可用的.但是,这并不一定意味着它正在使用中.
我不清楚是否在每个连接,每个数据库或全局基础上动态启用了线程安全性.
我也读过这个.它看起来sqlite3_config()可用于启用安全的多线程,但当然,我无法控制或了解操作系统本身可能如何使用此调用(我吗?).如果我在我的应用程序中再次进行该调用,是否可以安全地读取数据库,或者它是否只会对我的应用程序中使用相同sqlite3数据库句柄的多个线程的并发访问产生冲突?
无论如何,我的问题是......
我可以安全地读取iOS也可以访问的这个数据库,如果是这样,怎么样?
随着iOS 5的发布,我们在为sqlite数据库设置序列化选项时会遇到越来越多的错误(因此将其保存用于多线程).我们在sqlite3_config上收到SQLITE_MISUSE错误代码.有人注意到这种奇怪的行为吗?有人知道如何解决这个问题吗?它在之前的iOS版本上运行得非常好.
这是代码:
- (sqlite3 *)getNewDBConnection {
NSLog(@"sqlite3 lib version: %s", sqlite3_libversion());
//sqlite3_config() has to be called before any sqlite3_open calls.
if (sqlite3_threadsafe() > 0) {
int retCode = sqlite3_config(SQLITE_CONFIG_SERIALIZED);
if (retCode == SQLITE_OK) {
NSLog(@"Can now use sqlite on multiple threads, using the same connection");
} else {
NSLog(@"setting sqlite thread safe mode to serialized failed!!! return code: %d", retCode);
}
} else {
NSLog(@"Your SQLite database is not compiled to be threadsafe.");
}
sqlite3 *newDBconnection;
// Open the …Run Code Online (Sandbox Code Playgroud)