Как обновить базу данных 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;";

После выше двух операций он будет отлично работать для нового пользователя установки и пользователя обновления приложения