Почему внезапно испортилась моя БД Android SQLite? - PullRequest
5 голосов
/ 21 ноября 2010

Внезапно кажется, что база данных, которую использует мое приложение, испортилась.Я не изменил структуру базы данных, но сегодня я несколько раз переустанавливал приложение на своем устройстве.

Выдается следующее исключение.

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 голосов
/ 11 декабря 2010

Ae файлы sql lite DB не в текстовом формате?Не могли бы вы проанализировать файл БД, чтобы восстановить его?Кроме того, свойство locale, не заданное в таблице метаданных, подходит для вас Android.Если это так, то может случиться так, что удаление этой таблицы при ее создании вручную может восстановить вашу БД.

0 голосов
/ 25 ноября 2010

Возможно, база данных каким-то образом оставлена ​​в нелегальном состоянии, хотя это обычно помечается, и все идет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...