我有一个使用Sqlite作为数据库的android应用程序。它有以下表格:
我将原始数据库文件保存在assests文件夹中,当用户安装我的应用程序时,我只是将此数据库复制到/ data / data / package_name / databases目录。最初Favorites
表为空,并在用户后填充开始喜欢酒店。我的问题是,我想推出我的更新版本的应用程序,修复了一些错误,并在数据库中添加了一些新酒店,因此我需要使用新的酒店和位置更新现有用户的数据库,而不会影响收藏夹表。现在,如果我保留旧方法并更新数据库版本号,那么应用程序将删除旧数据库并使用新数据库,但收藏夹表中的所有数据都将丢失。我不希望它发生。现在问题是我该如何更新Hotels
和Locations
表而不丢失收藏夹表中的数据。
答案 0 :(得分:2)
我知道很久以前就问过这个问题了,但是我遇到了类似的问题并希望分享我的解决方案,似乎对我有用。我是新手所以请随意提供意见 -
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//code to keep table data
List<obj> objList = new ArrayList<obj>();
String selectQuery = "SELECT score,list_name,quiz_length FROM obj_table";
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
obj o = new obj();
o.final_score = cursor.getInt(0);
o.quiz_name = cursor.getString(1);
o.quiz_length = cursor.getInt(2);
objList.add(o);
} while (cursor.moveToNext());
}
//done storing data, now upgrade DB from asset file
try {
//my db file is upgraded here
copyDataBase();
} catch (IOException e) {
}
//now insert our saved table data
for (Score obj_rec: objList){
ContentValues values = new ContentValues();
values.put("score", obj_rec.final_score);
values.put("list_name", obj_rec.quiz_name);
values.put("quiz_length", obj_rec.quiz_length);
db.insert("obj_table", null, values);
}
}
答案 1 :(得分:1)
在更新之前,将上一个表的内容写入文件并保存在SD卡上。
然后您可以使用新版本更新数据库。
然后将备份文件(从sdcard)中的数据复制回更新的数据库。成功复制备份后,从SD卡中删除该文件。
答案 2 :(得分:0)
Usualy升级数据库必须使用SQLiteOpenHelper类完成。我会建议你在发布之前在自己的设备上做一些测试。您必须增加您的数据库版本并从sqlite调用“ALTER TABLE”方法。这里已经讨论过很多线程,我认为最清楚的就是这个:
Difficulty in upgrading SQlite table
这里甚至是一篇有一些解决方案的文章:
http://joshhendo.blogspot.de/2012/03/android-sqlite-database-upgrade.html
但是,一种安全的方法是将旧数据库保存在一个临时文件夹中,如果有任何事情发生混乱,用户可以取回旧数据库。