Настройка sqlite config SQLITE_CONFIG_SERIALIZED возвращает SQLITE_MISUSE на iOS 5 - PullRequest
3 голосов
/ 17 октября 2011

С выпуском iOS 5 мы получаем все больше и больше ошибок при настройке опции сериализации для базы данных sqlite (поэтому ее сохранение будет использоваться для многопоточности). Мы получаем код ошибки SQLITE_MISUSE на sqlite3_config. Кто-то заметил это странное поведение? И кто-нибудь знает, как я могу это исправить? Он отлично работает на предыдущих версиях 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 :)

Ответы [ 2 ]

12 голосов
/ 22 марта 2012

я боролся долго и упорно с этим, а также и, наконец, получил решение.

Как сказал @enobufs, sqlite3_config() необходимо вызвать до sqlite3_initialize(). Однако ОС может инициализировать для нас SQLite, поэтому я также делаю sqlite3_shutdown() перед sqlite3_config().

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

Тогда также необходимо использовать одно и то же соединение для каждого запроса, поскольку это доступ к соединению с базой данных, который сериализуется. Как описано здесь http://www.sqlite.org/capi3ref.html#sqliteconfigserialized

Поэтому я создаю соединение, как только приложение запускается, и передаю это соединение каждому классу, который в этом нуждается.

1 голос
/ 18 октября 2011

Вызывается ли sqlite3_config() раньше sqlite3_initialize()? Функция возвращает SQLITE_MISUSE, если вызывается после sqlite3_initialize() и до sqlite3_shutdown(). Подробнее см. http://www.sqlite.org/c3ref/config.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...