2011-10-17 34 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)。任何人都能弄清楚這一點? – 2011-10-28 20:47:25

回答

11

我一直在努力,努力工作,終於找到了解決辦法。

正如@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

因此,我在應用程序啓動後立即創建連接,並將連接傳遞給需要它的每個類。

+0

感謝tipp。它似乎現在可以工作,但如果它確實解決了我們的問題並且不會有任何副作用,則需要進一步測試。 – Buju

+0

它工作得很好.... – 2012-09-24 05:19:19

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()會自動調用。爲了解決我與ios的問題,在sqlite3_config()調用sqlite3之前,我明確地調用了sqlite3_initialize()。現在,我的sqlite3_config()返回SQLITE_OK和多線程訪問在ios 5上正常工作。我同意ios5發生了一些變化。祝你好運! – enobufs