在android中升级Sqlite数据库?

时间:2013-06-24 06:09:22

标签: android sqlite android-sqlite

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

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

3 个答案:

答案 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)

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

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

  3. 然后将备份文件(从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

但是,一种安全的方法是将旧数据库保存在一个临时文件夹中,如果有任何事情发生混乱,用户可以取回旧数据库。