随着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 database
if (sqlite3_open([[self getDatabaseFilePath] UTF8String], &newDBconnection) == SQLITE_OK) {
NSLog(@"Database Successfully Opened :)");
} else {
sqlite3_close(newDBconnection);
NSLog(@"Error in opening database :(");
}
return newDBconnection;
}
这是输出:
sqlite3 lib version: 3.7.7
setting sqlite thread safe mode to serialized failed!!! return code: 21
Database Successfully Opened :)
答案 0 :(得分:12)
我也一直在努力奋斗,最终得到了解决方案。
正如@enobufs所说,sqlite3_config()
之前需要调用sqlite3_initialize()
。但是,操作系统可能会为我们初始化SQLite,因此我也会在sqlite3_shutdown()
之前执行sqlite3_config()
。
sqlite3_shutdown()
sqlite3_config()
sqlite3_initialize()
。然后,还必须为每个查询使用相同的连接,因为它是对序列化的数据库连接的访问。如此处所述http://www.sqlite.org/capi3ref.html#sqliteconfigserialized
所以我在应用启动后立即创建一个连接,并将该连接传递给需要它的每个类。
答案 1 :(得分:1)
在sqlite3_config()
之前调用sqlite3_initialize()
了吗?如果在SQLITE_MISUSE
之后和sqlite3_initialize()
之前调用,该函数将返回sqlite3_shutdown()
。有关详细信息,请参阅http://www.sqlite.org/c3ref/config.html。