突然间,我的应用程序使用的数据库似乎已经损坏了。 我没有改变数据库的结构,但今天我在设备上重新部署了几次应用程序。
它抛出以下异常。
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)相比有多强大......