堆栈跟踪如下:
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 :(得分:0)
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()
步骤以明确删除它们。