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

Я пишу приложение для Android с использованием SQLite 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 снова?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Intereting Posts
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT больше не отключает домашний ключ на Android 4.1 Использование Picasso для загрузки изображения в растровое изображение Android MediaPlayer – setDataSource и Release – IllegalStateException Android – Смешивание нескольких статических сигналов в один AudioTrack Серый круг рядом с большим значком уведомления? Поверхность TextView Верхний цвет Как распознать конкретную сборку apk, даже если пользовательское обновление apk в Google Play EditText vs TextView Adb перестает обнаруживать мой телефон через некоторое время Ошибка Eclipse ADT: не удается запустить программу adb Android | Получить все дочерние элементы группы ViewGroup Используйте API-интерфейс игрока YouTube для настройки качества воспроизведения видео Android ArrayList <MyObject> проходит как возможно Дублировать файлы при добавлении компиляции с помощью Gradle в Android Studio Android: вычисление размера представления внутри MyAdapter :: getView