本文介绍了设置sqlite配置SQLITE_CONFIG_SERIALIZED在iOS 5上返回SQLITE_MISUSE的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

随着iOS 5的发布,我们在为sqlite数据库设置序列化选项时会遇到越来越多的错误(因此将其保存用于多线程)。我们在sqlite3_config上收到SQLITE_MISUSE错误代码。有人注意到这种奇怪的行为吗?有人知道如何解决这个问题吗?它在之前的iOS版本上运行得非常好。

With the release of iOS 5 we are getting more and more errors when setting the serialized option for the sqlite database (so its save to be used for multithreading). We are getting SQLITE_MISUSE error code on sqlite3_config. Has someone noticed this odd behavior? And does someone know how I can fix this? It works perfectly fine on previous iOS versions.

这里是代码:

- (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 :)


推荐答案

我一直在努力奋斗,最后得到了解决方案。

I struggled long and hard with this as well and finally got the solution.

正如@enobufs所说, sqlite3_config()需要在 sqlite3_initialize()之前调用。但是,操作系统可能会为我们初始化SQLite,所以我也在 sqlite3_config()之前执行 sqlite3_shutdown()。 / p>

As @enobufs said, sqlite3_config() needs to be called before sqlite3_initialize(). However, the OS might initialize SQLite for us so I also do a sqlite3_shutdown() before the sqlite3_config().


  1. sqlite3_shutdown()

  2. sqlite3_config()

  3. sqlite3_initialize()

  1. sqlite3_shutdown()
  2. sqlite3_config()
  3. sqlite3_initialize().

然后,还需要为每个查询使用相同的连接,因为它是对序列化的数据库连接的访问​​。如此处所述

Then its also necessary to use the same connection for every query as it is the access to the database connection that gets serialized. As described here http://www.sqlite.org/capi3ref.html#sqliteconfigserialized

所以我在应用程序启动后立即创建一个连接,并将该连接传递给需要它的每个类。

So I create a connection as soon as the app starts up and the pass that connection to every class that needs it.

这篇关于设置sqlite配置SQLITE_CONFIG_SERIALIZED在iOS 5上返回SQLITE_MISUSE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-22 14:39
查看更多