使用现有数据更新预加载的数据库

时间:2014-12-17 23:21:41

标签: android database sqlite upgrade

我有一个在Play商店上线的应用程序。它带有一个预装数据库,它捆绑在assets文件夹中,当用户最初启动应用程序时,db被复制到首选文件夹。

有一个收藏夹表,用户可在其中存储书签/收藏记录。

我有新数据和我用捆绑数据库做的其他一些修改,并且会将新APK上传到Play商店。

我担心的是,正在使用我的应用程序的用户,他们将获得更新通知,一旦他们更新,他们的应用程序将使用新的捆绑数据库,他们将丢失存储在收藏夹中的记录。

我做了一些谷歌搜索,当我们在运行时创建数据库时,SQLiteHelper onUpgrade()工作,但在我的情况下,它是预先加载的捆绑数据库。

如何在更新前备份收藏夹数据,然后将其加载回新的db文件中。

由于

1 个答案:

答案 0 :(得分:4)

在较新的版本中,您应该保留要保留的表数据。为此,您可以:

  1. 将旧数据库文件的副本复制到备份中。
  2. 将较新的数据库文件解压缩到工作目录
  3. 打开两个 SQLiteDatabase个对象,每个数据库文件对应一个。
  4. 复制要保留的表格中的所有数据。
  5. 如果一切都成功,请删除旧文件的备份。
  6. 对于第4步,您甚至不需要专门编写代码,可以对每个表进行编码,例如或多或少这样(警告,此代码未经测试):

    static void copyTable(SQLiteDatabase source, SQLiteDatabase destination, String tableName)
    {
        Cursor c = source.query(tableName, null, null, null, null, null, null);
    
        destination.beginTransaction();
        try
        {
            String[] columns = c.getColumnNames();
            ContentValues insertValues = new ContentValues();
            while (c.moveToNext())
            {
                insertValues.clear();
                for (int i = 0; i < columns.length; i++)
                    insertValues.put(columns[i], c.getString(i));
    
                destination.insert(tableName, null, insertValues);
            }
    
            destination.setTransactionSuccessful();
        }
        finally
        {
            destination.endTransaction();
        }
    
        c.close();
    }