2013-07-19 84 views
3

的堆棧跟蹤刪除SQLite數據庫行時得到了磁盤已滿的例外是下面:試圖在安卓

android.database.sqlite.SQLiteFullException: database or disk is full 
     at android.database.sqlite.SQLiteStatement.native_executeSql(Native Method) 
     at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:90) 
     at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1917) 
     at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1857) 
     at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:719) 
     at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:273) 
     at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:96) 
     at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1759) 
     at com.test.testapp.recovery(test.java:289) 
     at com.test.testapp.run(test.java:167) 

雖然我的代碼只是刪除該條目。

mDatabase = dbOpener.getWritableDatabase();     
    mDatabase.delete("table", "name = ?", "row1"); 

我以爲只有在磁盤插入到數據庫時纔可能是滿的。有任何想法嗎?

+0

請考慮磁盤*可能*實際上已滿的情況,即使是刪除,它也會記錄在日誌中。 – Machinarius

回答

0

Here is more information關於SQLite數據庫結構和使用幫助我。刪除行不一定是開放空間。

編輯從SQLite的常見問題解答:I deleted a lot of data but the database file did not get any smaller. Is this a bug?

編輯#2:使用VACCUM命令的實際可用空間。

本質上,空間被標記爲「空閒」,但保持關閉在磁盤上,以便重新使用新的插入。如果您所做的只是刪除行,則該空間永遠不會返回到磁盤。你需要使用VACCUM來返回它。

0

您可以做的最好的事情是確認設備上的數據庫文件以及它們的大小。只需連接設備並運行一個像這樣的ADB shell命令(很明顯,你的包替換com.yourpackage):

adb shell "ls -las /data/data/com.yourpackage/databases/*" 

我發現我的自動化測試,留下大量的數據庫文件的文件系統上。這包括以-wal,-shm-journal結尾的文件。

對於我的修爲-wal-shm文件是確保我刪除它之前叫上我的數據庫.close(),爲確保臨時文件被刪除。

至於-journal文件,我添加了一個tearDown()步驟來顯式刪除它們。

+0

在刪除它之前調用'.close()'? – kidoher