为什么我的Android SQLite数据库突然崩溃了?

时间:2010-11-21 20:19:01

标签: android database 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)一样健壮到什么程度......

2 个答案:

答案 0 :(得分:0)

可能会以某种方式将数据库置于非法状态,尽管这通常会被标记并且一切都很好。

答案 1 :(得分:0)

Ae sql lite数据库文件不是文本可读格式?难道你不能解析DB文件来重建它吗? locale属性也不是android为您提供的元数据表上设置的属性。如果是这样的话,可能会有关闭该表的情况,手动创建它可能会恢复您的数据库。