Android SQLite Обновление без потери данных
Я успешно создал базу данных SQLite, и она отлично работает. Однако когда вызывается метод onUpgrade, я бы хотел сделать это без потери данных. Приложение, которое я разрабатываю, является приложением викторины. Проще говоря, когда вызывается метод onCreate, я создаю и заранее заполняю базу данных вопросами, ответами и т. Д. В последнем столбце указано, установили ли они вопрос в качестве избранного или нет. Я хотел бы, чтобы при вызове метода onUpgrade я хотел бы временно сохранить один столбец, удалить всю базу данных, воссоздать его с любыми изменениями, внесенными мной в старые вопросы, и добавить все новые вопросы, а затем повторно -Добавить вопросы, которые они задали в качестве избранных.
Итак, я попробовал один вариант:
db.execSQL("ALTER TABLE quiz RENAME TO temp_quiz");
onCreate(db);
db.execSQL("INSERT INTO quiz (favouries) SELECT favourites FROM temp_quiz");
db.execSQL("DROP TABLE IF EXISTS temp_quiz");
Однако это не работает из-за того, что INSERT INTO просто добавляет новые строки, а не заменяет существующие. Я также попытался заменить, вставить или заменить на и
db.execSQL("INSERT INTO quiz (_id, favouries) SELECT _id, favourites FROM temp_quiz");
из которых никто не работает.
В настоящее время я настроил его на работу, изменив имя таблицы, вызвав метод onCreate (db), а затем установив курсор, который читает каждую строку и использует метод db.update (), как показано ниже:
int place = 1;
int TOTAL_NUMBER_OF_ROWS = 500;
while (place < TOTAL_NUMBER_OF_ROWS) {
String[] columns = new String[] { "_id", ..........., "FAVOURITES" };
// not included all the middle columns
Cursor c = db.query("temp_quiz", columns, "_id=" + place, null, null, null, null);
c.moveToFirst();
String s = c.getString(10);
// gets the value from the FAVOURITES column
ContentValues values = new ContentValues();
values.put(KEY_FLAG, s);
String where = KEY_ROWID + "=" + place;
db.update(DATABASE_TABLE, values, where, null);
place++;
c.close();
}
Однако, хотя это работает, это очень медленно и будет только ухудшаться, поскольку мое количество вопросов увеличивается. Есть ли быстрый способ сделать все это?
Спасибо! Постскриптум В идеале он должен обновлять только строку, если она есть. Поэтому, если в обновлении я решу удалить вопрос, он должен принять это во внимание и не добавлять новую строку, если строка не содержит никаких других данных. Возможно, будет проще заставить его удалить строки, в которых нет данных вопросов, а не предотвратить их добавление.