【问题标题】:Upgrading Sqlite database in android?在android中升级Sqlite数据库?
【发布时间】:2013-06-20 13:49:56
【问题描述】:

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

  1. 酒店
  2. 地点
  3. 收藏夹

我将原始数据库文件保存在 assests 文件夹中,当用户安装我的应用程序时,我只是将此数据库复制到 /data/data/package_name/databases 目录。最初Favorites 表是空的,它会在用户开始喜欢后填充酒店。我的问题是我想启动我的更新版本的应用程序,修复了一些错误并将一些新酒店添加到数据库中,所以我需要在不影响收藏夹表的情况下用新酒店和位置更新现有用户的数据库。现在如果我保留我的旧方法并更新数据库版本号,然后应用程序将删除旧数据库并使用新数据库,但收藏夹表中的所有数据都将丢失。我不希望它发生。现在问题是我如何更新 @ 987654322@ 和 Locations 表不会丢失收藏夹表中的数据。

【问题讨论】:

    标签: android sqlite android-sqlite


    【解决方案1】:

    我知道很久以前就有人问过这个问题,但我遇到了类似的问题并想分享我的解决方案,这似乎对我有用。我是新手,请随意提供意见-

     @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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      通常升级数据库必须使用 SQLiteOpenHelper 类。我建议您在发布之前在您自己的设备上进行一些测试。您必须增加您的数据库版本并从 sqlite 调用“ALTER TABLE”方法。这已经在很多帖子中讨论过了,我认为最清楚的是这个:

      Difficulty in upgrading SQlite table

      这里甚至还有一篇文章提供了一些解决方案:

      http://joshhendo.blogspot.de/2012/03/android-sqlite-database-upgrade.html

      但是,一种安全的方法是将旧数据库保存在临时文件夹中,如果出现任何问题,用户可以取回旧数据库。

      【讨论】:

        【解决方案3】:
        1. 在更新之前将您之前的表的内容写入文件并将其保存在 sdcard 上。

        2. 然后您可以使用新版本更新您的数据库。

        3. 然后将数据从备份文件(从 sdcard)复制回更新的数据库。备份成功后,从sdcard中删除文件。

        【讨论】:

        • 在第一步中,您的意思是将收藏夹表数据复制到 sdcard 中。我应该将此数据复制到哪种格式?
        • @user818455 这取决于你。你可以用 json 格式或任何其他适合你目的的格式编写。文本文件也是一种选择。但我更喜欢json(或者xml)。 ***推荐使用Json
        • @prateek 他自己会在他的应用程序代码中这样做!!!他显然会知道自己在做什么!
        • 真的有必要将内容复制到文件吗?你不能只创建一些List&lt;Whatever&gt;,然后将每个对象插入新数据库中吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-14
        • 2014-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多