2010-10-14 83 views
8

我在使用SQLite作爲數據庫後端的iPhone SDK上的新應用程序出現問題。iPhone SDK上的sqlite數據庫磁盤映像格式不正確

偶爾,我的應用程序將停止加載數據到我的UITableViews,並通過組織者下載設備數據庫後,我可以通過命令行訪問SQLite數據庫。我可以查詢某些表,但沒有得到一個「SQL錯誤:數據庫磁盤映像格式錯誤」的錯誤。見下面一個SQLite會話:

SQLite version 3.6.17 
    Enter ".help" for instructions 
    Enter SQL statements terminated with a ";" 
    sqlite> select * from user; 
    1|[email protected]|cpjolicoeur||4d055e38bb1d3758|image/gif|cartoonme_avatar.gif||Craig|Jolicoeur|1|1 
    sqlite> select * from item; 
    SQL error: database disk image is malformed 
    sqlite> 

在這個例子中我的用戶表工作正常,但我的項目表的格式不正確,這與我在我的應用我看到那裏的項目不負載對應。該應用程序不會崩潰,數據只是沒有加載,因爲這個畸形的錯誤。

任何想法爲什麼會發生這種情況?我唯一的想法是,也許數據庫被損壞,因爲我通過應用程序內的後臺線程寫入SQLite數據庫。我通過後臺線程中的NSOperationQueue從網絡服務器下載數據,並使用下載的數據更新SQLite數據庫。會在後臺線程中寫入數據庫(雖然可能從主線程讀取)會損壞數據庫,還是其他的東西?

回答

5

在調試時,您必須非常小心訪問數據庫的後臺線程!這是因爲當調試器停止處理時(例如在斷點處),所有線程都暫停,包括可能處於數據庫調用中間的線程,在數據庫「打開」和數據庫「關閉」調用之間的某處。

如果您在某個斷點處暫停,然後單擊Xco​​de中的停止標誌,您的應用程序將立即退出。這經常會導致錯誤,例如您看到的錯誤或「數據庫損壞」錯誤。

確實沒有任何解決方案(因爲沒有辦法修改「停止任務」的行爲,但我已經開發了一些技術來緩解它: 1.添加代碼以檢測進入背景的應用程序,以及2.在調試過程中切勿使用停止標誌停止處理,而應該在斷點完成後按「繼續」,在模擬器或設備上點擊主頁按鈕(這會觸發您添加的代碼在步驟1)中,等待應用程序後臺,然後您可以停止運行

0

取決於如何編譯SQLite,它可能或可能不是線程安全的。如果你使用的是內置的,它可能沒有你想要的編譯時選項。

對於我們的應用程序,我們必須滾動我們自己的SQLite才能添加全文搜索。看看this page

5

在我的情況下,這與iOS 7有關:在iOS 7上,Core Data現在使用SQLite WAL日誌模式將數據寫入一個.db-wal文件而不是直接到.db文件。在我的應用程序中,我會在應用程序更新期間將準備好的.db文件複製到Library/Application Support中。問題在於舊的.db-wal文件仍在該目錄中,我只替換了.db文件。這樣,我結束了.db文件與舊的.db-wal文件不同步。

有兩個解決這個問題:

  1. 確保.db,您複製新.db文件到位前.db-wal.db-shm文件被刪除。
  2. 回到舊的預搭載iOS 7的行爲,像這樣:https://stackoverflow.com/a/18870738/171933
+0

刪除沃爾瑪和SHM文件完全爲我做!謝謝 – 2014-01-22 15:16:27

相關問題