У меня есть приложение с базой данных, созданное и открытое с использованием стандартного SQLiteOpenHelper.
Всякий раз, когда я обновляю версию базы данных, я также обновляю код версии приложения, поэтому нет возможности для базы данных опускаться (номер версии базы данных всегда увеличивается и никогда не уменьшается).
Я отключил резервное копирование базы данных в своем приложении, установив для свойства android:allowBackup
значение false.
Но когда я обновляю приложение в Play Store, я получаю много сбоев
Невозможно понизить базу данных с версии
n
доn-1
96% этих сбоев происходит на устройстве Samsung. Кто-нибудь знает, почему эта проблема возникает, и что еще более важно, как предотвратить этот крах?
Я знаю, что я могу переопределить onDowngrade, чтобы предотвратить сбой, но на самом деле я не понимаю, почему onDowngrade вызывается вообще, поскольку авария вызывается в приложении, которое всегда использует последнюю версию базы данных.
Изменить: добавлен образец кода, FWIW
Мой OpenHelper:
public class MyDBHelper extends SQLiteOpenHelper {
private static final String LOG_TAG = MyDBHelper.class.getName();
public static final String DB_NAME = "my_db";
public static final int DB_V1 = 1;
public static final int DB_V2_UNIQUE_IDS = 2;
public static final int DB_V3_METADATAS = 3;
public static final int DB_V4_CORRUPTED_IDS = 4;
public static final int DB_V5_USAGE_TABLE = 5;
public static final int DB_VERSION = DB_V5_USAGE_TABLE;
public MyDBHelper(final Context context, IExceptionLogger logger) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(final SQLiteDatabase db) {
Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onCreate()");
db.execSQL(createMyTable());
}
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onUpgrade(): oldVersion = " + oldVersion + " : newVersion = " + newVersion);
if (oldVersion < 2) {
Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onUpgrade(): upgrading version 1 table to version 2");
db.execSQL(upgradeTable_v1_to_v2());
}
if (oldVersion < 3) {
Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onUpgrade(): upgrading version 2 Entry table to version 3");
db.execSQL(upgradeTable_v2_to_v3());
}
}
@Override
@TargetApi(Build.VERSION_CODES.FROYO)
public void onDowngrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onDowngrade(): oldVersion = " + oldVersion + " : newVersion = " + newVersion);
super.onDowngrade(db, oldVersion, newVersion);
}
}
И как я его инициализирую:
public class DatabaseController {
private MyDBHelper mDBHelper;
public void initialize(final Context context) {
mDBHelper = new MyDBHelper(context);
}
}