Я выполнил несколько поисков и прочитал несколько сообщений, но мне все еще не удалось обновить базу данных, не потеряв уже сохраненные данные.Обновление предварительно загруженной базы данных sqlite без потери пользовательских данных в android
Я создал БД с помощью этого учебника: http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/
В новой базе данных Я хочу, чтобы перенести данные из основной таблицы в новую таблицу, которая будет хранить любимый пользователь. В настоящее время они хранятся в основной таблице. В функции onupgrade я попытался переименовать таблицу и вставить запись в новую таблицу. Это не сработало. Я также попытался сохранить данные в курсор, а затем заполнить новую таблицу, но это не сработало. Для этих методов я получил ошибки, говоря, что новая/старая таблица не найдена.
Ниже приведена функция onUpgrade().
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion > oldVersion) {
db.execSQL("ALTER TABLE books rename to old_books");
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
db.execSQL("INSERT into favourites (_id, type, title, notes,rating) SELECT _id ,type, title, notes, rating FROM old_books where rating > 0;");
db.execSQL("DROP TABLE IF EXISTS old_books;");
}
}
Есть ли лучший способ обновить базу данных без потери данных с помощью реализации из учебника? Все, что мне нужно сделать, это скопировать избранное из таблицы «books» и загрузить их в таблицу «избранное», когда пользователи обновляют приложение.
Что должен делать вызов 'copyDataBase()'? –
@CL. copyDatabase() копирует БД из APK на устройство. Коза внизу. 'private void copyDataBase() throws IOException { InputStream myInput = myContext.getAssets(). open (DB_NAME); Строка outFileName = DB_PATH + DB_NAME; OutputStream myOutput = новый FileOutputStream (outFileName); байт [] buffer = новый байт [1024]; int length; while ((length = myInput.read (buffer))> 0) { myOutput.write (buffer, 0, length); } myOutput.flush(); myOutput.close(); myInput.close(); } ' – Kenute
И почему вы делаете это в середине' onUpgrade'? –