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および-shmファイルの修正は、データベースを削除する前にデータベースを呼び出すこと.close()でした。これにより、一時ファイルが確実に削除されます。

-journalファイルに関しては、tearDown()明示的に削除する手順を追加しました。

于 2014-07-24T23:42:43.697 に答える