2015-03-09 2 views
1

Я выполнил несколько поисков и прочитал несколько сообщений, но мне все еще не удалось обновить базу данных, не потеряв уже сохраненные данные.Обновление предварительно загруженной базы данных 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» и загрузить их в таблицу «избранное», когда пользователи обновляют приложение.

+1

Что должен делать вызов 'copyDataBase()'? –

+0

@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

+0

И почему вы делаете это в середине' onUpgrade'? –

ответ

0

onUpgrade вызывается, когда база данных открыта и транзакция активна. Вы не можете перезаписать файл базы данных в это время (и это потеряет все данные в старом файле).

Просто удалите звонок copyDataBase().

+0

Где я могу переписать? – Kenute

+0

Вы не будете переписывать вообще. Вы обновляете базу данных с помощью команд SQL. –

+0

Можете ли вы показать, как я буду это кодировать? Я пробовал различные попытки, но ничего не работает. – Kenute

0

Если вы используете браузер SQLite для получения предварительно загруженной базы данных, чтобы обновить файл базы данных, измените его версию, не создайте новый файл базы данных и не храните данные! Source tutorial .... по-моему, этот урок лучше и подробнее, чем тот, который вы реферировали.

Смежные вопросы