突然之間,似乎我的應用程序正在使用的數據庫已經損壞。 我沒有更改數據庫的結構,但我今天在我的設備上多次重新部署應用程序。爲什麼我的Android SQLite數據庫突然變壞了?
它拋出以下異常。
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);
}
}
- 我基本上打開/關閉兩個 每個 操作數據庫和遊標。
- 一些文章指出 這是要走的路,但對於 Android應用程序,也不會更有意義 保持數據庫連接開放 所有的時間?
- 我可以想象得到它 需要更多的資源 每次打開/關閉它。
- 有多個活動和服務 訪問數據庫。 (可能在同一時間)
- 我從來沒有看到在日誌
任何想法可能是什麼造成這一點,如何從中恢復,以及如何防止這種情況在未來的一個例外? 我有一個印象,由於一些併發問題(多個線程試圖打開/關閉或讀取/寫入數據庫),異常即將到來。我不知道SQLite數據庫在多線程訪問,鎖定等方面與普通數據庫(mysql-oracle)一樣健壯的程度。.....
您是否看過使用數據提供程序跨多個實例共享數據? – Emile 2010-12-10 21:20:16
這是在我的TO-DO清單上,並且據我所知,這可能是一個選項,因爲它爲你做了很多管道工作,但是,我只有一張表,我讀取和寫入。我也無意將數據公開給其他應用程序。我只想知道它是如何被破壞的,以及如何避免它(仍然使用std SQLiteDatabase和SQLiteOpenHelper類) – ddewaele 2010-12-10 22:46:46
除非你已經修復它,否則我會進一步調查rosstheboss的答案。你提到你有訪問數據庫的服務和活動。鑑於兩個活動從來沒有真正活躍在同一時間,你可以假設有安全(r)。但是,您提到的服務可能會與活動同時運行。我不是java的專家,但我會想象有一些方法可以幫助鎖定/檢查數據庫上的鎖定。即已經打開,或鎖定/解鎖數據庫。這樣可以避免衝突,至少可以捕捉錯誤。 – Emile 2010-12-13 15:57:34