Как обновить базу данных SQLite и не потерять все данные?
Я добавляю таблицу в SQLite DB моего приложения. Весь мой синтаксис там в порядке, не проблема. Но у меня возникли проблемы с созданием новой таблицы должным образом. Я добавил новую таблицу....
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
db.execSQL(CREATE_REQUESTS);
db.execSQL(CREATE_OVERRIDE);
}
мой метод create. У меня 3 стола. Когда я обновил номер версии, я получил сообщение об ошибке "запросы таблицы (ссылаясь на CREATE_REQUESTS) уже были созданы."Посмотрите на мой метод onUpgrade...
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS contacts");
onCreate(db);
}
привел меня к пониманию, что строка db.execSQL("DROP TABLE IF EXISTS contacts")
, который ссылается на мою таблицу DATABASE_CREATE в методе onCreate, используется для удаления старой таблицы, а затем следующей строки,onCreate(db);
воссоздает его. Я не добавлял запросы в эту строку execSQL, что и вызвало ошибку. Вот проблема: я бы предпочел не потерять данные в двух таблицах, которые у меня уже есть. Есть ли способ, чтобы добавить таблицу, как я пытаюсь сделать, и не потерять все старые данные? Спасибо.
2 ответов
вы можете делать все, что хотите в onUpgrade
. Вы можете использовать ALTER
для добавления новых столбцов в таблицу.
в худшем случае, если ваша схема полностью и полностью отличается, вам придется создать новую таблицу, заполнить ее, используя данные из старой таблицы, а затем удалить старую таблицу.
В любом случае onUpgrade
был разработан, чтобы обеспечить плавное обновление без потери данных. Это просто до вас, чтобы реализовать его должным образом.
если версия DB: 6
Ex : There is a table with 5 columns
при обновлении до : 7 ( я добавляю 1 новый столбец 3 таблицы)
1. We need to add the columns when creating a table
2. onUpgrade method:
if (oldVersion < 7)
{
db.execSQL(DATABASE_ALTER_ADD_PAPER_PAID);
db.execSQL(DATABASE_ALTER_LAST_UPLOADED);
db.execSQL(DATABASE_ALTER_PAPER_LABEL);
}
где:" DATABASE_ALTER_ADD_PAPER_PAID " - это запрос.
EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE "
+ TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;";
После выше двух операций он будет отлично работать для нового пользователя установки и пользователя обновления приложения