14

最近の 2 週間で、アプリの更新をリリースせずに、データベースが破損しているというレポートを大量に受け取り始めました。以下はスタックトレースです。Android はデータベースを開くことができず、コンピューターの sqlite-manager プログラムも開くことができませんでした。ただし、Firefox への SQLite マネージャー アドオンはそれを開くことができました。コマンド「コンパクトデータベース」を実行した後、データベースが修正され、Androidで開くことができました。アプリ内でこのようなことを行う方法はありますか? 大きな問題は、以下のスタックトレースでわかるように、新しいバージョンの Android がデータベースをすぐに削除して置き換えるため、データベースを開こうとすることさえできないことです。データベースを開かずに PRAGMA ステートメントを何らかの方法で実行できますか?

よろしく、

02-22 09:55:20.245: ERROR/Database(5382): CREATE TABLE android_metadata failed
02-22 09:55:20.245: ERROR/Database(5382): Failed to setLocale() when constructing, closing the database
02-22 09:55:20.245: ERROR/Database(5382): android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed
02-22 09:55:20.245: ERROR/Database(5382):     at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
02-22 09:55:20.245: ERROR/Database(5382):     at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950)
02-22 09:55:20.245: ERROR/Database(5382):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1818)
02-22 09:55:20.245: ERROR/Database(5382):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
02-22 09:55:20.245: ERROR/Database(5382):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
02-22 09:55:20.245: ERROR/Database(5382):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
02-22 09:55:20.245: ERROR/Database(5382):     at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540)
02-22 09:55:20.245: ERROR/Database(5382):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)

02-22 09:55:20.245: ERROR/Database(5382): Deleting and re-creating corrupt database /mnt/sdcard/myapp/backup.sqlite
02-22 09:55:20.245: ERROR/Database(5382): android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed
02-22 09:55:20.245: ERROR/Database(5382):     at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
02-22 09:55:20.245: ERROR/Database(5382):     at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950)
02-22 09:55:20.245: ERROR/Database(5382):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1818)
02-22 09:55:20.245: ERROR/Database(5382):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
02-22 09:55:20.245: ERROR/Database(5382):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
02-22 09:55:20.245: ERROR/Database(5382):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
02-22 09:55:20.245: ERROR/Database(5382):     at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540)
02-22 09:55:20.245: ERROR/Database(5382):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)

編集:私は次のようにデータベースを開くように管理します:

db = SQLiteDatabase.openDatabase(database, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);

しかし、これを実行すると:

String sqlQuery = "pragma integrity_check";
db.execSQL(sqlQuery);

私はこれを得る:

ERROR/AndroidRuntime(9144): Caused by: android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed: pragma integrity_check

Edit2:データベースをバキュームすると問題が解決することに気付きました。しかし、exeSQL("vacuum") を使用してアプリ内からバキューム処理を行うと、役に立ちません。どうしてこれなの?:'(

4

3 に答える 3

1

Androidがデータベースを削除することは確かに問題です。

デフォルトの Android SQLite 実装の代わりにSQLJetを使用することが解決策になる可能性があることに気付きました。
その名前が示すように、SQLJet はオープン ソースの Java SQLite クライアントであり、Android で動作します。

于 2011-10-14T09:01:20.920 に答える
1

破損したデータベースを回復する標準的な良い方法は、それを SQL としてダンプしてから、新しいデータベースに再度読み込むことです。sqlite ツールを使えば簡単です。

sqlite in.db .dump | sqlite out.db

...しかし、もちろん、コードで行う必要があり、.dump がどこからでも利用できるかどうかはわかりません。

そもそもどのように破損しているのかを調べてみることをお勧めします --- SQLite は、内部ストレージでしか使用したことがありませんが、私にとって常に堅実でした。FAT ファイルシステムをチェックして、破損しているかどうかを確認できますか? たとえば、さまざまなあいまいな方法でカード上のファイルシステムを完全に破壊するデジタルカメラを見てきました...

于 2011-02-28T11:15:18.623 に答える
0

アプリで、アクティビティを終了する前にデータベースを閉じますか?logcatを監視し、アプリの実行時にエラーや警告がないかどうかを確認します。

于 2011-03-07T02:32:19.127 に答える