【问题标题】:Setting sqlite config SQLITE_CONFIG_SERIALIZED returns SQLITE_MISUSE on iOS 5在 iOS 5 上设置 sqlite config SQLITE_CONFIG_SERIALIZED 返回 SQLITE_MISUSE
【发布时间】:2011-10-17 15:26:45
【问题描述】:

随着 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 :)

【问题讨论】:

  • 我遇到了同样的问题,在 sqlite3_config() 之后调用 sqlite3_initialize() 并不能解决问题。对 config() 的调用仍然返回 SQLITE_MISUSE(代码 21)。任何人都能够解决这个问题?

标签: iphone sqlite ios5


【解决方案1】:

我也为此苦苦挣扎了很久,终于找到了解决方案。

正如@enobufs 所说,sqlite3_config() 需要在sqlite3_initialize() 之前调用。但是,操作系统可能会为我们初始化 SQLite,所以我还在 sqlite3_config() 之前做了一个 sqlite3_shutdown()

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

然后它还需要为每个查询使用相同的连接,因为它是对被序列化的数据库连接的访问​​。如此处所述http://www.sqlite.org/capi3ref.html#sqliteconfigserialized

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

【讨论】:

  • 感谢您的提示。它现在似乎可以工作,但是如果它真的解决了我们的问题并且不会有任何副作用,还需要进一步测试。
  • @naudec 在应用程序的哪个位置调用这 3 种方法?它在appdeleage.cs 中吗?以及您将哪些参数传递给sqlite3_config()
  • 道歉@user1 我无法再访问这个代码库了,我已经记不清了?
【解决方案2】:

sqlite3_config() 是否在 sqlite3_initialize() 之前调用?如果在sqlite3_initialize() 之后和sqlite3_shutdown() 之前调用,该函数将返回SQLITE_MISUSE。详情请见http://www.sqlite.org/c3ref/config.html

【讨论】:

  • 我没有调用任何这些方法。它在以前的版本中运行良好。
  • 我也没有使用早期版本的 ios 调用 _initialize()/_shutdown() 函数并且工作正常。但是 ios 5 的多线程操作失败。显然,如果在没有 SQLITE_OMIT_AUTOINIT 的情况下编译库,则会自动调用 sqlite3_initialize()。为了解决我的 ios 问题,我在 sqlite3_config() 之后显式调用了 sqlite3_initialize(),然后再调用任何其他 sqlite3 函数。现在我的 sqlite3_config() 返回 SQLITE_OK 并且多线程访问在 ios 5 上正常工作。我同意 ios5 发生了一些变化。祝你好运!
猜你喜欢
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
相关资源
最近更新 更多