Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中升级Sqlite数据库?_Android_Sqlite_Android Sqlite - Fatal编程技术网

在android中升级Sqlite数据库?

在android中升级Sqlite数据库?,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,我有一个android应用程序,它使用Sqlite作为数据库。它有以下表格: 旅馆 地点 最爱 我将我的原始数据库文件保存在Assets文件夹中,当用户安装我的应用程序时,我只将此数据库复制到/data/data/package\u name/databases目录。最初收藏夹表为空,并且在用户开始喜欢酒店后填充。我的问题是,我想启动更新版本的应用程序,并修复一些错误和错误数据库中新增了一些新酒店,因此,我需要用新的酒店和地点更新现有用户的数据库,而不影响收藏夹表。现在,如果我保留旧方法并更新数

我有一个android应用程序,它使用Sqlite作为数据库。它有以下表格:

  • 旅馆
  • 地点
  • 最爱
  • 我将我的原始数据库文件保存在Assets文件夹中,当用户安装我的应用程序时,我只将此数据库复制到/data/data/package\u name/databases目录。最初
    收藏夹
    表为空,并且在用户开始喜欢酒店后填充。我的问题是,我想启动更新版本的应用程序,并修复一些错误和错误数据库中新增了一些新酒店,因此,我需要用新的酒店和地点更新现有用户的数据库,而不影响收藏夹表。现在,如果我保留旧方法并更新数据库版本号,则应用程序将删除旧数据库并使用新数据库,但收藏夹表中的所有数据都将丢失。我不希望发生这种情况。现在的问题是如何做我更新
    酒店
    位置
    表,而不会丢失收藏夹表中的数据

  • 更新前,将上一个表的内容写入文件并保存在SD卡上

  • 然后,您可以使用新版本更新数据库

  • 然后将数据从备份文件(SD卡)复制回更新后的数据库。成功复制备份后,从SD卡中删除该文件


  • 通常,数据库升级必须使用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他自己也会在他的应用程序代码中这样做!!!他显然知道他在做什么!是否真的需要将内容复制到文件中?难道你不能创建一些
    列表
    ,然后将每个对象插入新数据库吗?