Невозможно понизить базу данных с версии 2 до 1 даже после новой установки и повторного запуска

Я пишу приложение для Android, используя SQLite DB.

У меня было несколько экспериментов и я изменил версию DB с 1 на 2.

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

Я решил снова изменить версию на 1.

Я сделал новую установку, и все сработало нормально.

Но затем запуск во второй раз вызывает эту ошибку:

06-05 10:03:35.683: E/AndroidRuntime(9010): android.database.sqlite.SQLiteException: Can't downgrade database from version 2 to 1
06-05 10:03:35.683: E/AndroidRuntime(9010):     at android.database.sqlite.SQLiteOpenHelper.onDowngrade(SQLiteOpenHelper.java:361)

Почему это, в конце концов, я сделал новую установку, и БД также нужно было удалить. Нет?

Как я могу снова изменить версию на 1?

Ответ 1

Это исключение выбрасывается при следующих условиях:

  • На устройстве, на котором запущен код, есть файл базы данных версии 2.
  • Код запрашивает версию 1 базы данных (с параметром для конструктора SQLiteOpenHelper)
  • onDowngrade() не переопределяется в вашем коде.

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

Ответ 2

Вы можете переопределить onDowngrade() по своему усмотрению, если хотите иметь возможность запускать свое приложение с базой данных на устройстве с более высокой версией, чем может обрабатывать ваш код.

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

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

Если вам нужно переопределить этот метод, пожалуйста, прочтите этот вопрос также.

Без переопределения этого метода мы не сможем уменьшить версию SQLite после увеличения и выполнения. Таким образом, вам нужно изменить обратно на 2 или больше, чем 2:

public DatabaseHelper(Context context) {
   super(context, DB_NAME, null, 2);
}

Если вы пытаетесь обновить свою таблицу, вероятно, нужно пропустить 3 не 2 и каждый раз, когда вам нужно обновить таблицу, вам нужно увеличить версию (а не уменьшить).

Ответ 4

Вы не показываете, где создается база данных, где обычно назначается версия базы данных (т.е. SQLiteOpenHelper ctor).

Есть ли вероятность, что у вас есть база данных на внешней файловой системе? Если вы не соблюдаете соглашения об именах, эти файлы не удаляются при удалении приложения.

Ответ 5

Как вы выполнили новую установку?

  • adb install -r? В этом случае данные вашего приложения, включая базу данных (ов), не будут затронуты.
  • adb uninstall и adb install? Это был бы правильный способ выполнить чистую установку. Все данные будут удалены во время uninstall, и ваша база данных будет создана только после первого запуска после install.

Но вы пишете, что во время первого запуска после новой установки он работал. Это может означать, что вы где-то еще выполняете обновление до версии 2.

Ответ 6

Обновление: Перейдите к информации о приложении и > Хранение и четкие данные также должны работать.

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

Также из Marshmallow данные приложения Android автоматически сохраняются. для таргетинга приложений 23+, чтобы ваше приложение могло получить предыдущую базу данных из облако, не зная.

К сожалению, вы пока не можете удалить данные приложения отдельно. Но если вы не возражаете убить свои резервные данные для всех приложений, вы можете удалить приложение, а затем перейти к https://myaccount.google.com/dashboard и расширить Android и удалите резервные копии данных приложения.

После этого вы сможете переустановить приложение и получить новую новую базу данных.

Это сработало для меня, но сделайте это на свой страх и риск.

Ответ 7

Это означает, что уже есть предыдущий файл, и вы пытаетесь создать еще одно имя с тем же именем, вы можете изменить имя базы данных или на устройстве, которое вы эмулируете, удалите приложение и снова эмулируйте его.

Ответ 8

Была такая же проблема, и я решил ее так.

@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  db.setVersion(oldVersion);
}

Ответ 9

onDowngrade() не переопределяется в вашем коде. Вы должны обработать onDownGrade().

Ответ 10

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

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

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

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

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

enter image description here