4

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

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

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

4

3 回答 3

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);
    }
}
于 2014-01-23T16:35:31.170 回答
1
  1. 在更新之前,将上一个表的内容写入文件并将其保存在 sdcard 上。

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

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

于 2013-06-24T06:14:13.627 回答
0

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

SQlite表升级困难

甚至还有一篇带有一些解决方案的文章:

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

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

于 2013-06-24T07:00:56.737 回答