Я уже создал таблицы sqlite для своего приложения, но теперь хочу добавить новую таблицу в базу данных.
Я изменил версию БД, как показано ниже
private static final int DATABASE_VERSION = 2;
и добавлена строка для создания таблицы
private static final String DATABASE_CREATE_color =
"CREATE TABLE IF NOT EXISTS files(color text, incident_id text)";
onCreate
и onUpgrade
как показано ниже:
@Override
public void onCreate(SQLiteDatabase database) {
database.execSQL(DATABASE_CREATE_incident);
database.execSQL(DATABASE_CREATE_audio);
database.execSQL(DATABASE_CREATE_video);
database.execSQL(DATABASE_CREATE_image);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//drop table and add new tables when version 2 released.
db.execSQL(DATABASE_CREATE_color);
}
Но почему-то новая таблица не создается. Что я делаю не так?
Ответы:
1. О onCreate () и onUpgrade ()
onCreate(..)
вызывается всякий раз, когда приложение только что установлено.onUpgrade
вызывается всякий раз, когда приложение обновляется и запускается, а версия базы данных отличается.2. Увеличение версии db
Вам нужен конструктор вроде:
ВАЖНО: одного лишь увеличения версии приложения недостаточно для
onUpgrade
вызова!3. Не забывайте своих новых пользователей!
Не забудьте добавить
к вашему методу onCreate (), иначе для недавно установленных приложений таблица не будет.
4. Как справиться с множественными изменениями базы данных с течением времени
Когда у вас есть последовательные обновления приложений, некоторые из которых содержат обновления базы данных, вы обязательно должны проверить
oldVersion
:Таким образом, когда пользователь обновляется с версии 1 до версии 3, он получает оба обновления. Когда пользователь обновляется с версии 2 до 3, он просто получает обновление версии 3 ... В конце концов, вы не можете рассчитывать на то, что 100% вашей пользовательской базы будет обновляться каждый раз, когда вы выпускаете обновление. Иногда пропускают обновление или 12 :)
5. Контролируйте номера редакций во время разработки
И наконец ... звонок
полностью удаляет приложение. Когда вы устанавливаете снова, вы гарантированно попадете,
onCreate
что избавит вас от необходимости постоянно увеличивать версию базы данных в стратосфере по мере разработки ...источник
oldVersion
переданный аргумент? Если какие-либо операторы обновления повторяются, вы можете в конечном итоге повторить их в наиболее актуальной базе данных. Если одним из операторов является усечение таблицы, это будет очень плохо.newVersion
это бесполезно, так как вы всегда устанавливаете текущую версию базы данных в конструкторе (см. часть 2), и она всегда будет соответствовать. Ключевая идея здесь заключается в том, что вы не хотите просто обновляться оттуда, где находится пользователь,newVersion
без прохождения всех других дополнительных обновлений между ними.CREATE_READINGS
Логика никогда не должна быть в onUpgrade, поскольку она была вonCreate
методе вашей первой версии. Думайте о случаях вonUpgrade
коммутаторе как о «Я выполняю обновление сoldVersion
». Вы бы не создавали таблицу показаний, если бы выполняли обновление с версии 1, поскольку она уже должна существовать. Надеюсь, это имеет смысл ...Ваш код выглядит правильно. Я предполагаю, что база данных уже думает, что она обновлена. Если вы выполнили проект после увеличения номера версии, но до добавления
execSQL
вызова, база данных на вашем тестовом устройстве / эмуляторе может уже полагать, что это версия 2.Быстрый способ проверить это - изменить номер версии на 3 - если он обновится после этого, вы знаете, что это произошло только потому, что ваше устройство считало, что оно уже было обновлено.
источник
onCreate()
как указал jkschneider.Вы можете использовать
onUpgrade
метод SQLiteOpenHelper . В методе onUpgrade вы получаете oldVersion как один из параметров.При
onUpgrade
использовании aswitch
и в каждом изcase
s используйте номер версии, чтобы отслеживать текущую версию базы данных.Лучше всего, если вы перейдете от
oldVersion
кnewVersion
, увеличиваяversion
на 1 за раз, а затем обновите базу данных шаг за шагом. Это очень полезно, когда кто-то с версией базы данных 1 обновляет приложение через долгое время до версии, использующей базу данных версии 7, и приложение начинает давать сбой из-за некоторых несовместимых изменений.Затем обновления в базе данных будут выполняться поэтапно, охватывая все возможные случаи, то есть с учетом изменений в базе данных, сделанных для каждой новой версии, и тем самым предотвращать сбой вашего приложения.
Например:
источник
Ответ @jkschneider правильный. Однако есть подход получше.
Запишите необходимые изменения в файл sql для каждого обновления, как описано по ссылке https://riggaroo.co.za/android-sqlite-database-use-onupgrade-correctly/
from_1_to_2.sql
from_2_to_3.sql
from_3_to_4.sql
Эти файлы .sql будут выполняться в методе onUpgrade () в соответствии с версией базы данных.
DatabaseHelper.java
Пример проекта также представлен по той же ссылке: https://github.com/riggaroo/AndroidDatabaseUpgrades
источник
Работа с версиями базы данных - очень важная часть разработки приложений. Я предполагаю, что у вас уже есть расширяемый класс AppDbHelper
SQLiteOpenHelper
. Когда вы его расширите, вам нужно будет реализоватьonCreate
иonUpgrade
метод.Когда
onCreate
иonUpgrade
вызываемые методыonCreate
вызывается при новой установке приложения.onUpgrade
вызывается при обновлении приложения.Организация версий базы данных Я управляю версиями в методах класса. Создайте реализацию интерфейса Migration. Например, для
MigrationV1
класса создания первой версии, создания второй версииMigrationV1ToV2
(это мое соглашение об именах)Пример миграции:
onCreate
: ПосколькуonCreate
будет вызываться при новой установке приложения, нам также необходимо выполнить все миграции (обновления версии базы данных). ТакonCreate
будет выглядеть так:onUpgrade
: Этот метод будет вызываться, когда приложение уже установлено и обновлено до новой версии приложения. Если приложение содержит какие-либо изменения базы данных, поместите все изменения базы данных в новый класс миграции и увеличьте версию базы данных.Например, допустим, пользователь установил приложение с версией базы данных 1, и теперь версия базы данных обновлена до 2 (все обновления схемы сохраняются
MigrationV1ToV2
). Теперь, когда приложение обновлено, нам нужно обновить базу данных, применив изменения схемы базы данныхMigrationV1ToV2
следующим образом:источник