предположим, что у меня есть таблица базы данных test_table с 2 столбцами и соответствующее создание script в SQLiteOpenHelper:
DB_VERSION = 1:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B);
}
Это начальная версия приложения 1, которая публикуется в Play Маркете.
Через некоторое время обновляется приложение и используемая база данных. Я думаю, класс SQLiteOpenHelper должен быть адаптирован следующим образом:
DB_VERSION = 2:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B, COL_C)");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_C");
}
Через некоторое время обновится другое приложение:
DB_VERSION = 3:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B, COL_C, COL_D)");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_D");
}
- > Здесь мне нужен совет. Если пользователь устанавливает приложение 1, у него есть столбцы A и B. Если он затем обновляется до версии 2, onUpgrade запускает и добавляет столбец C. Новые пользователи, которые устанавливают с нуля, получают три столбца с помощью инструкции create. Если пользователь затем обновляется до версии 3, onUpgrade запускается снова и добавляется столбец D. Но ЧТО ЕСЛИ пользователь устанавливает приложение 1, а затем пропускает обновление версии 2 и обновляет версию 3? Тогда он бы пропустил
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_C");
}
часть и только
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_D");
}
что приведет к таблице test_table (COL_A, COL_B, COL_D)??
Каков правильный способ обработки обновлений базы данных в прямом приложении, чтобы пользователь не потерял свои данные? Нужно ли проверять все возможные (старые) версии в методе onUpgrade() и выполнять разные инструкции таблиц переменных на основе этой версии?
Я спрашиваю, потому что в моем приложении пользователь имеет возможность экспортировать и импортировать данные, что является не чем иным, как экспортом: скопируйте всю базу данных и импортируйте: замените базу данных приложения резервной копией базы данных.
Что произойдет, если пользователь имеет приложение версии 1, экспортирует базу данных, обновляет приложение (новая структура базы данных) и импортирует резервную копию старой версии 1? - > Как будет вести себя SQLiteOpenHelper? - > Каков правильный способ обработки обновлений db вместе с функциями импорта/экспорта?