3

堆栈跟踪如下:

   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");

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

4

2 回答 2

0

这是有关 SQLite 数据库结构和使用的更多信息,对我有帮助。删除行不一定是打开空间。

从 SQLite FAQ编辑:我删除了很多数据,但数据库文件并没有变小。这是一个错误吗?

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

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

于 2013-07-19T23:12:58.690 回答
-1

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

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

我发现我的自动化测试在文件系统上留下了很多数据库文件。-wal这包括以,-shm和.结尾的文件-journal

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

至于-journal文件,我添加了一个tearDown()明确删除它们的步骤。

于 2014-07-24T23:42:43.697 回答