突然、私のアプリケーションが使用しているデータベースが壊れているようです。 私はデータベースの構造を変更しませんでしたが、今日私のデバイスに何回もアプリケーションを再デプロイしました。AndroidのSQLite DBが突然壊れたのはなぜですか?
次の例外がスローされます。
E/Database(14281): CREATE TABLE android_metadata failed err=26 ..
E/Database(14281): Failed to setLocale() when constructing, closing the database
E/Database(14281): android.database.sqlite.SQLiteException: file is encrypted or is not a database
E/Database(14281): at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
E/Database(14281): at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1848)
E/Database(14281): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1798)
E/Database(14281): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:798)
E/Database(14281): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:857)
E/Database(14281): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:850)
E/Database(14281): at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:539)
E/Database(14281): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193)
E/Database(14281): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
E/Database(14281): at com.ecs.android.gps.storage.DBAdapter.open(DBAdapter.java:75)
データベースは、SQLLiteOpenHelperクラスを使用して初期化されます。
public DBAdapter(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion)
{
Log.w(TAG, "Upgrading database from version " + oldVersion
+ " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS location_history");
onCreate(db);
}
}
- 私は基本的に各 操作に データベースとカーソルの両方を閉じる/開いています。
- いくつかの記事では、これが移動するための方法であること 示しますが、 アンドロイドアプリのために、オープン すべての時間をデータベース接続を維持するために多くの意味 をすることはないだろうか?
- 多くのリソースを に毎回開いたり閉じたりすると想像することができます。
- がデータベースにアクセスするアクティビティとサービスは複数あります。 (潜在的に同時に)
- 私は、ログ
で、そこからリストアする方法、これを引き起こしている可能性があり、どのように将来的にはこれを防ぐためにどのような任意のアイデアを、例外を見たことがありませんか? 私はいくつかの並行性の問題(複数のスレッドがデータベースをオープン/クローズしようとする、または読み書きしようとしている)のために例外が発生しているという印象を持っています。私はマルチスレッドのアクセス、ロックなどに関して、SQLiteデータベースが通常のデータベース(mysql - oracle)と同じくらい堅牢であるかどうかわかりません.....
複数のアクチュエイトでデータを共有するためにデータプロバイダを使用しましたか? – Emile
それは私のTO-DOリストにあり、私が理解しているところでは、それはあなたのための配管の多くを行うのでオプションになるかもしれませんが、私は読み書きするテーブルが1つしかありません。私はまた、他のアプリにデータを公開するつもりはありません。私はちょうどそれがどのように壊れて、それを避けることができます(まだSQLiteDatabaseとSQLiteOpenHelperクラスを使用して)を避けることができることを知りたいです – ddewaele
それを修正していない限り、私はさらにrossthebossの答えを調べます。あなたは、データベースにアクセスするサービスとアクティビティがあると述べました。与えられた2つのアクティビティは、同時に安全ではないと仮定することができます(r)。しかし、あなたが言及したサービスは、おそらくアクティビティと同時に実行されるでしょう。私はjavaの専門家ではありませんが、データベースのロックをロック/チェックするのに役立つメソッドがいくつかあると思います。私。すでに開いているか、データベースをロック/ロック解除しています。これにより、競合を回避し、少なくともエラーを捕捉することができます。 – Emile