代码之家  ›  专栏  ›  技术社区  ›  ddewaele

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

  •  5
  • ddewaele  · 技术社区  · 15 年前

    我没有改变数据库的结构,但是我今天在我的设备上重新部署了好几次。

    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)一样健壮。。。。。

    2 回复  |  直到 15 年前
        1
  •  0
  •   rosstheboss    15 年前

    可能是由于某种原因使数据库处于非法状态,尽管通常会被标记并且一切正常。

        2
  •  0
  •   Emile    15 年前

    Ae sql lite DB文件不是文本可读格式?你不能解析数据库文件来重建它吗?还有locale属性,不是android cel为您创建的元数据表上设置的。如果是这样的话,可能会有这样的情况:删除表a,手动创建它可能会恢复您的DB。