在android中升级Sqlite数据库?
我有一个android应用程序,它使用Sqlite作为数据库。它有以下表格:在android中升级Sqlite数据库?,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,我有一个android应用程序,它使用Sqlite作为数据库。它有以下表格: 旅馆 地点 最爱 我将我的原始数据库文件保存在Assets文件夹中,当用户安装我的应用程序时,我只将此数据库复制到/data/data/package\u name/databases目录。最初收藏夹表为空,并且在用户开始喜欢酒店后填充。我的问题是,我想启动更新版本的应用程序,并修复一些错误和错误数据库中新增了一些新酒店,因此,我需要用新的酒店和地点更新现有用户的数据库,而不影响收藏夹表。现在,如果我保留旧方法并更新数
收藏夹
表为空,并且在用户开始喜欢酒店后填充。我的问题是,我想启动更新版本的应用程序,并修复一些错误和错误数据库中新增了一些新酒店,因此,我需要用新的酒店和地点更新现有用户的数据库,而不影响收藏夹表。现在,如果我保留旧方法并更新数据库版本号,则应用程序将删除旧数据库并使用新数据库,但收藏夹表中的所有数据都将丢失。我不希望发生这种情况。现在的问题是如何做我更新酒店
和位置
表,而不会丢失收藏夹表中的数据
通常,数据库升级必须使用SQLiteOpenHelper类完成。我建议您在发布之前在自己的设备上进行一些测试。您必须增加数据库版本,并从sqlite调用“ALTERTABLE”方法。这已经在这里的许多线程中进行了讨论,我认为最清晰的是: 这里甚至有一篇文章提供了一些解决方案:
然而,一种安全的方法是将旧数据库保存在tempfolder中,这样用户可以在任何事情陷入混乱时取回旧数据库 我知道这个问题很久以前就被问到了,但我也有一个类似的问题,我想和大家分享我的解决方案,这似乎对我很有帮助。我是个新手,所以请随意输入-
@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);
}
}
@覆盖
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
//保存表数据的代码
List objList=new ArrayList();
String selectQuery=“从obj\U表中选择分数、列表名称、测验长度”;
Cursor Cursor=db.rawQuery(selectQuery,null);
//循环遍历所有行并添加到列表
if(cursor.moveToFirst()){
做{
obj o=新的obj();
o、 最终得分=cursor.getInt(0);
o、 quick_name=cursor.getString(1);
o、 测验长度=cursor.getInt(2);
对象列表添加(o);
}while(cursor.moveToNext());
}
//完成数据存储,现在从资产文件升级数据库
试一试{
//我的数据库文件在这里升级
copyDataBase();
}捕获(IOE异常){
}
//现在插入保存的表数据
对于(分数对象记录:对象列表){
ContentValues=新的ContentValues();
价值。投入(“分数”,目标记录最终分数);
value.put(“列表名称”,对象记录名称);
值。put(“测验长度”,对象记录测验长度);
db.insert(“obj_表”,空,值);
}
}
在第一步中,您的意思是复制SD卡中的收藏夹表数据。我应该将此数据复制到哪种格式?@user818455,具体取决于您。。您可以使用json格式或任何其他适合您的用途的格式编写。文本文件也是一个选项。但我更喜欢json(或者xml)***Json是recommended@prateek他自己也会在他的应用程序代码中这样做!!!他显然知道他在做什么!是否真的需要将内容复制到文件中?难道你不能创建一些列表
,然后将每个对象插入新数据库吗?