2011-10-17 14 views
3

iOS 5のリリースでは、sqliteデータベースのシリアル化されたオプションを設定する際にエラーが増えています(そのため、その保存をマルチスレッドに使用します)。私たちはsqlite3_configでSQLITE_MISUSEエラーコードを取得しています。誰かがこの奇妙な行動に気付いたのですか?そして、誰かが私がこれをどのように修正できるか知っていますか?これは、以前のiOSバージョンでも問題なく動作します。ここsqlite設定を設定するSQLITE_CONFIG_SERIALIZEDはiOS 5でSQLITE_MISUSEを返します

はコードです:

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

同じ問題が発生しました。sqlite3_config()の後にsqlite3_initialize()を呼び出しても問題は解決されません。 config()の呼び出しでもSQLITE_MISUSE(コード21)が返されます。誰でもこれを理解することができましたか? –

答えて

11

私もこれで長く苦労して解決しました。

@enobufsによると、はsqlite3_initialize()の前に呼び出す必要があります。しかし、OSは私たちのためにSQLiteを初期化するかもしれませんので、sqlite3_config()の前にsqlite3_shutdown()も実行します。

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

また、すべてのクエリで同じ接続を使用することは、シリアル化されるデータベース接続へのアクセスと同じです。ここに記載の通りhttp://www.sqlite.org/capi3ref.html#sqliteconfigserialized

私は、アプリケーションが起動するとすぐに接続を作成し、それを必要とするすべてのクラスにその接続を渡します。

+0

tippのためにありがとう。今は動作しているようですが、実際に私たちの問題を解決し、副作用がない場合、これはさらにテストする必要があります。 – Buju

+0

これはとてもうまくいっています.... –

1

sqlite3_initialize()前に呼び出さsqlite3_config()ですか?この関数は、sqlite3_initialize()の後、sqlite3_shutdown()の前に呼び出された場合は、SQLITE_MISUSEを返します。詳細はhttp://www.sqlite.org/c3ref/config.htmlを参照してください。

+0

私はこれらの方法を呼び出すつもりはありません。以前のバージョンでは正常に動作します。 – Buju

+1

私は、以前のバージョンのiosで* _initialize()/ * _ shutdown()関数を呼び出しておらず、正常に動作していませんでした。しかし、マルチスレッドの操作はios 5で失敗しました。明らかに、SQLITE_OMIT_AUTOINITなしでライブラリをコンパイルすると、sqlite3_initialize()が自動的に呼び出されます。私の問題を解決するために、他のsqlite3関数が呼び出される前にsqlite3_initialize()をsqlite3_config()の後に明示的に呼び出しました。今私のsqlite3_config()は、SQLite_OKとios5で正しく動作するマルチスレッドアクセスを返します。何かがios5で変更されたことに同意します。がんばろう! – enobufs

関連する問題