尝试从android中的sqlite数据库中删除行时得到磁盘完全异常

时间:2013-07-19 22:24:59

标签: android 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");

我认为只有在插入数据库时​​磁盘才能满。有任何想法吗?

2 个答案:

答案 0 :(得分:0)

关于SQLite数据库结构和使用的

Here is more information帮助了我。删除行不一定是空位。

来自SQLite FAQ的

编辑I deleted a lot of data but the database file did not get any smaller. Is this a bug?

编辑#2 :使用VACCUM命令实际释放空间。

本质上,空间被标记为“空闲”但在磁盘上保持关闭以便重新使用新插入。如果你所做的只是删除行,那么该空间永远不会返回到磁盘。你需要使用VACCUM来返回它。

答案 1 :(得分:0)

您可以做的最好的事情是确认设备上的数据库文件以及它们的大小。只需连接设备并运行这样的adb shell命令(显然用您的包替换com.yourpackage):

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

我发现我的自动化测试在文件系统上留下了大量数据库文件。其中包含以-wal-shm-journal结尾的文件。

对我来说,-wal-shm文件的修复是为了确保在删除之前在我的数据库上调用.close(),因为这样可以确保删除临时文件。

对于-journal文件,我添加了tearDown()步骤以明确删除它们。