突然之间,似乎我的应用程序正在使用的数据库已经损坏。 我没有更改数据库的结构,但我今天在我的设备上多次重新部署应用程序。为什么我的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