所以,我已经把我的应用程序放在了Playstore ....
现在,我想在我的应用程序中向数据库添加一列。为此,我必须升级我的数据库,这可以通过更改数据库版本来完成。
用户已经在数据库中有一些东西,当我上传我的应用程序的更新版本(更改版本的数据库)时,它将创建一个新的数据库,用户将丢失他/她拥有的所有东西在他/她的数据库中。
这个问题的解决方案是什么?以及如何将旧数据库的内容备份/恢复到新数据库? (我知道如何通过简单地以编程方式将数据库粘贴到外部存储来备份数据库。)
答案 0 :(得分: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;");
}
}
因此。您正在创建临时表并在该表中保存所有需要的信息。接下来,删除表,创建新表并从临时表中为其插入值。您可以添加其他字段,随意将所有内容放在那里。
更新: 经过一番谷歌搜索后,我找到了一个更简单的解决方案:
@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 table方法将改变您的数据库结构而不会丢失数据。
答案 1 :(得分: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);
}
};
以下是onUpgrade()中有关ALTER TABLE用例的Android文档。因此,在这种情况下,如果您不重命名或删除现有表格,则不需要备份旧表格。
如果添加新列,可以使用ALTER TABLE将它们插入到 现场表。