Подтвердить что ты не робот

Невозможно понизить базу данных с версии `n` до` n-1` на Samsung

У меня есть приложение с базой данных, созданное и открытое с использованием стандартного 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);

    }
}
4b9b3361

Ответ 1

Это реализация по умолчанию SQLiteOpenHelper.onDowngrade(...):

public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    throw new SQLiteException("Can't downgrade database from version " +
            oldVersion + " to " + newVersion);
}

Как вы видите, если вы вызываете super.onDowngrade(...), как и вы, вы получите это исключение. Вам нужно реализовать onDowngrade самостоятельно, не вызывая super.onDowngrade. Он всегда должен быть реализован для полноты, поскольку нет гарантии, когда его можно было бы назвать - это звучит странно, что пользователь изменил использование более старой версии приложения, но может возникнуть такая ситуация. Знаете ли вы, какая версия приложения имеет исключения?

Ответ 2

Ваш комментарий в ответе @etan:

почему для onDowngrade был вызван абсолютно без причины?

Существует абсолютная причина,

public static final int DB_V5_USAGE_TABLE = 5;

public static final int DB_VERSION = DB_V5_USAGE_TABLE;

ваш DB_VERSION содержит 5, а в вашем конструкторе вы передаете это значение. Очевидно, аргумент для версии должен быть больше, чем предыдущая версия, иначе вы получите это сообщение.

Как указано в @etan, если вам нужно понизить версию, вам необходимо правильно переопределить метод onDowngrade, вместо этого снова сбросив ошибку.

Возможно, вам это известно, поэтому попробуйте вспомнить предыдущую версию или попробуйте передать 6 или больше для параметра версии базы данных.

Ответ 3

скачать файл sqlite db с Android DeviceFileExplorer

[данные/данные/имя вашего пакета/базы данных]

открыть файл с помощью (DB Browser для SQLite)

перейдите на вкладку " Редактировать прагмы " и понизьте версию БД с версии пользователя

наконец сохраните файл и загрузите его в DeviceFileExplorer

enter image description here