У меня есть 2 класса: TableA
и TableB
, соответствующие таблицам SQLite в первой версии моего приложения.
Теперь я готов выпустить следующую версию, где мне нужно добавить другую таблицу, TableC
.Проблема с обновлением SQLite
В каждом классе у меня есть метод onCreate(SQLiteDatabase sqlDatabase)
и onUpgrade(SQLiteDatabase sqlDatabase, int oldVersion, int newVersion)
.
Вот что я хочу сделать: сохранить TABLEA, как это,
добавить новый столбец в TableB
и, конечно же, создать новый TableC.
Я обновил мою версию базы данных номер в SQLiteOpenHelper я мои методы реализованы, как показано ниже:
TableA.onUpgrade(/*parameters*/){
//Nothing to do here
}
TableB.onUpgrade(/*parameters*/){
sqlDatabase.execSQL("ALTER TABLE TableB ADD COLUMN columnFoo INTEGER DEFAULT 1");
}
TableC.onUpgrade(/*parameters*/){
sqlDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(sqlDatabase); //calls sqlDatabase.execSQL(CREATE_TableC);
}
Моя реализация SQLiteOpenHelper подкласс выглядит, как показано ниже:
@Override
public void onCreate(SQLiteDatabase sqlDatabase) {
TableA.onCreate(sqlDatabase);
TableB.onCreate(sqlDatabase);
TableC.onCreate(sqlDatabase);
}
@Override
public void onUpgrade(SQLiteDatabase sqlDatabase, int oldVersion, int newVersion)
{
TableA.onUpgrade(sqlDatabase);
TableB.onUpgrade(sqlDatabase);
TableC.onUpgrade(sqlDatabase);
}
Моя проблема что у меня проблемы с этим.
Когда я установил новую версию своего приложения на новую виртуальную машину Genymotion Android, у меня появилась ошибка в запросе, который я делаю в своем запуске на TableB, заявив, что новый столбец не существует.
Я тестировал обновление на существующей виртуальной машине Genymotion Android, на которой была установлена 1-я версия моего приложения.
Там он работал нормально.
Я, конечно, могу продолжать создавать новые виртуальные машины для каждого запуска и устанавливать свое приложение для тестирования.
Но я хотел спросить, что я могу делать неправильно, и что было бы хорошим способом проверить.
Как правильно обрабатывать базу данных для моих существующих пользователей и как мне создать новую базу данных/таблицы для моих новых пользователей?
Любая помощь приветствуется!
Мое приложение поддерживает Android API 14 (ICS) и выше.
Когда вы вызываете свой метод onUpgrade, поскольку он звучит как в вашем сообщении, вы вызываете его _allways_. –
Я предполагаю, что SQLLiteOpenHelper 'onUpdate()' вызывается всякий раз, когда номер версии базы данных, определенный в этом классе, увеличивается. – rgamber
Извинения, я проверил код для SQLLiteOpenHelper и он управляет onUpdate() для вас. Какой уровень API на Android вы тестируете, и вы удаляете приложение и переустанавливаете для тестирования версии 1 на версию 2. –