2012-11-27 161 views
1

任何人都可以解釋爲什麼下面的事情發生。這是使用SQLite數據庫的Android應用程序。數據庫連接丟失後訪問SQLite數據庫

  1. 應用程序將新數據添加到存儲在外部存儲器中的db。
  2. 與此同時,此外部存儲器變得不可用(例如,我將它掛載到PC)。
  3. 當外部存儲器再次變爲可用時,我無法訪問db中的read_only模式。但是,如果我試圖在讀寫模式下打開它,它會很好。爲什麼?

我寫的代碼(下同),其中處理這個問題和它的作品很好,但我還是不明白爲什麼

這是不是與剩餘的開放連接或類似的東西有關。爲了保險起見,我完全從設備中刪除了我的應用並重新安裝。但即使在那之後,db在只讀模式下也不可用。在db打開一次後,在讀寫模式下,可能會在下次打開只讀沒有任何問題。

當我說「不可用」時,我的意思是db打開狀態良好,但是任何對db的查詢都會因IO錯誤而失敗。

 SQLiteDatabase db = SQLiteDatabase.openDatabase(f.getPath(), null, SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS); 

     if (!testQuery(db)) 
     { 
      Utils.logD("Failed to open db at path: " + f + ". Trying recovering..."); 
      db.close(); 
      db = SQLiteDatabase.openDatabase(f.getPath(), null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); 
      if (!testQuery(db)) 
      { 
       Utils.logD("Failed to open db at path: " + f + " (noway)"); 
       db.close(); 
       return null; 
      } 
     } 



     Utils.logD("DATABASE OPENED! " + db.hashCode()); 

回答

1

如果在事務處於活動狀態時數據庫不可用,則必須在數據庫再次處於一致狀態之前回滾此事務。該回滾需要寫入權限。

這意味着您應該只在只讀模式下打開一個數據庫,只要它從未更改過。

+0

謝謝。它很好地解釋了發生了什麼,儘管它仍然迫使我打開數據庫在應用程序部分寫入數據,從不寫任何內容。 (我有2個進程 - 一個添加/刪除數據,第二個只讀) –