it-roy-ru.com

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

Я пишу приложение для Android с использованием базы данных SQLite.

Я провел несколько экспериментов и изменил версию БД с 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 снова?

11
Elad Benda2

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

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

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

16
laalto

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

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

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, и каждый раз, когда вам нужно обновить таблицу, вам нужно увеличить версию (не уменьшить).

1
Blasanka

Это исключение происходит, когда базу данных необходимо понизить, но ваш SQLiteOpenHelper - производный класс не реализует обратный вызов onDowngrade .

0
CL.

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

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

0
guycole

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

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

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

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

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

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

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

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

0
Dittimon

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

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

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

0
msal

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

0
H.Josue