2011-05-18 21 views
0

最近,我在我的iPhone應用程序中實現了一個使用SQLite的緩存組件。 我正在編寫和閱讀本機W/O任何包裝框架的數據。 問題是,在使用該應用程序一段時間後,它開始獲取SQLITE_CORRUPT狀態代碼以響應我在數據庫中執行的任何SQL語句。iPhone中的SQLITE_CORRUPT問題

我使用的SQLiteManager作爲我的DB MGMT工具。當數據庫損壞時,我試圖通過SQLiteManager進行分析和檢查,但它甚至不允許我瀏覽表中的數據,只是輸出一條說明數據已損壞的簡明消息。

任何人都可以用這一個幫助?首先 - 數據庫如何處理這種情況,其次 - 我怎樣或從哪裏可以看到數據?

感謝, 蓋伊。

+0

你將有權發佈你,如果你希望其他人能夠幫助你處理緩存的代碼。 但是,是否有一個很好的理由不使用NSUserDefaults來做你正在做的事情?或者甚至只是在應用的文檔目錄中維護一個plist文件?不知道你的意思是什麼「緩存組件」,但是除非你真的必須使用sql,否則sql是一種痛苦(當你需要時,我會使用核心數據而不是直接處理SQL)。 – CharlieMezak 2011-05-18 13:21:43

+0

感謝您的評論@CharlieMezak。 plist和NSUserDefaults對我來說不夠好,因爲我需要一個比保存鍵值條目更復雜的機制。我檢查了核心數據,但我並不需要模擬我的實體並實現O \ R映射,所以它也不適合。我只剩下原生的SQL ... – Guys 2011-05-19 07:06:39

+0

您可能不需要核心數據的某些功能,但至少您不必擔心直接與SQL打交道。我會直接跳過SQL包裝並直接轉到核心數據。它很乾淨,很簡單,如果你發現你需要它們,它就具有更高級的功能。 – CharlieMezak 2011-05-19 13:08:56

回答

1

你可以參照這個official documentation。在這裏他們提到db很少有機會被破壞。

他們如何DB可以被損壞,也列出了chances。並從那裏引用下面的例子,可以導致問題的數據庫。

CREATE TABLE ex1(a INTEGER PRIMARY KEY, b); 
    INSERT INTO ex1 VALUES(1,2); 
    INSERT INTO ex1 VALUES(2,3); 
    CREATE TRIGGER ex1_tr1 AFTER UPDATE ON ex1 BEGIN 
    DELETE FROM ex1 WHERE a=old.b; 
    END; 

    UPDATE ex1 SET b=b+1; 

在上面的示例中,UPDATE的第一個循環導致觸發器觸發並刪除ex1表的第二行。當UPDATE循環的第二個循環運行時,它會嘗試處理ex1表的第二行。 SQLite認識到第二行已被刪除,所以它會中止第二個循環,但它沒有正確清理,這可能會導致循環後續循環中的數據庫損壞。

所以,基本上你需要找出你的代碼中發生這種情況,通過調試或通過你的應用程序或任何其他機制的後續步驟。

+0

感謝您的參考!看着鏈接,發現REPLACE INTO子句可能導致腐敗..我用「原始」更新替換REPLACE並插入。將更新如果工作。 – Guys 2011-05-19 07:00:30

+0

@Guys我的榮幸。如果它適合你,會很高興。如果它確實接受答案或者提出答案。謝謝。 – 2011-05-19 09:47:41

+0

@Guys我的回答對你有幫助嗎?如果是,請接受答案。 – 2011-06-03 05:29:14