2015-01-10 2 views
3

Итак, у меня уже есть приложение на playstore ....обновить базу данных SQLite в моем приложении

Теперь я хочу, чтобы добавить столбец в базу данных в моем приложении. Для этого я должен обновить свою базу данных, которая может быть выполнена путем изменения версии базы данных.

Пользователи уже будут иметь некоторые вещи в базе данных, и когда я загружу обновленную версию своего приложения (с измененной версией базы данных), он создаст новую базу данных, и пользователь потеряет все содержимое, которое он/она имеет в своей базе данных.

Каково решение этой проблемы? А как создать резервную копию/восстановить содержимое старой базы данных в новую базу данных? (Я знаю, как сделать резервную копию базы данных, просто скопируйте ее в программную папку, вставляя базу данных во внешнее хранилище).

+0

Перенос данных из существующей базы данных в новую базу данных с дополнительной колонкой. Когда миграция завершена, можно удалить старую базу данных. Итак, какое-то время у вас есть 2 базы данных. –

+0

. Появляется ли ваше новое приложение с заранее созданной базой данных или вы просто хотите обновить старый? – Simas

+0

@TimCastelijns хорошо, это одно решение. Большое спасибо. Но это будет слишком много работы, просто добавив столбец в таблицу в базе данных. Давайте посмотрим, знает ли кто-нибудь более короткое решение. Если нет, то материал перенастройки будет единственным спасителем –

ответ

2

Вы можете использовать способ onUpgrade().

Что-то вроде этого:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (oldVersion == 1 && newVersion == 2) { 
     db.execSQL("create temporary table people_tmp (" 
      + "id integer, name text, position text, posid integer);"); 

     db.execSQL("insert into people_tmp select id, name, position, posid from people;"); 
     db.execSQL("drop table people;"); 

     db.execSQL("create table people (" 
      + "id integer primary key autoincrement," 
      + "name text, posid integer);"); 

     db.execSQL("insert into people select id, name, posid from people_tmp;"); 
     db.execSQL("drop table people_tmp;"); 
    } 

}

Зв Вы создаете временную таблицу и сохраняете всю необходимую информацию внутри этой таблицы. Затем вы отбрасываете таблицу, создаете новую и вставляете в нее значения из своей временной таблицы. Вы можете добавить дополнительные поля и не стесняйтесь вкладывать туда все, что хотите.

UPDATE: После небольшого Googling я нашел простое решение:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

// If you need to add a column 
if (newVersion == 2) { 
    db.execSQL("ALTER TABLE foo ADD COLUMN new_column INTEGER DEFAULT 0"); 
} 
} 

Alter метод таблицы изменит структуру базы данных без потери данных.

+0

Я никогда не знал, что это существовало ... позвольте мне немного поработать и посмотреть, работает ли он ...+1 для ваших усилий :) –

+0

Это работает, если столбец уже существует? – Simas

+0

@ user3249477, извините, но я не могу понять ваш ответ. Мы являемся архитектурой нашей базы данных, поэтому мы можем с уверенностью знать, используется ли это имя столбца внутри нашего приложения. И мы можем работать со столами с обычным языком sql. Итак, что вы подразумеваете под своим вопросом? – Anatol

1

Если вы только добавляете новый столбец, вы можете изменить существующую таблицу вместо создания новой таблицы. Пример:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if(oldVersion<2){ 
     db.execSQL("ALTER TABLE "+this.getTableName()+" ADD COLUMN "+COLUMNS.NAME+ " integer default 0;", null); 
     db.execSQL("UPDATE "+this.getTableName()+ " SET "+COLUMNS.NAME+ "="+COLUMNS.NAMEVALUE+";", null); 
    } 
}; 

Вот Android документация на использование ALTER TABLE в случае onUpgrade(). Поэтому в этом случае, если вы не переименовываете или не удаляете существующую таблицу, вам не нужно архивировать старую таблицу.

Если вы добавляете новые столбцы, вы можете использовать ALTER TABLE, чтобы вставить их в таблицу .

Также смотрите: https://stackoverflow.com/a/8291718/2777098

+0

это сработало .. спасибо, согласился с другим ответом, потому что он первым упомянул этот метод ... спасибо :) –

+0

Он обновил свой ответ, чтобы принять мое решение для ALTER вместо таблицы CREATE. Не уверен, почему вы думаете, что он сделал в первую очередь. но в любом случае, рад помочь –

+0

no bro .. он редактировал до того, как u ответил ... см. его историю изменений :) –

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