Android预打包数据库更新

Android预打包数据库更新,android,database,sqlite,upgrade,Android,Database,Sqlite,Upgrade,我正在为android开发一个测验类型的应用程序,目标是随着时间的推移能够扩展题库。为此,我正在预打包SQLite数据库,并检查更新,并在升级时覆盖它: @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(newVersion>oldVersion) { InputStream inputStream = null; Outpu

我正在为android开发一个测验类型的应用程序,目标是随着时间的推移能够扩展题库。为此,我正在预打包SQLite数据库,并检查更新,并在升级时覆盖它:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if(newVersion>oldVersion) {
        InputStream inputStream = null;
        OutputStream outStream = null;
        String dbFilePath = DATABASE_PATH + DATABASE_NAME;
        try {
            inputStream = myContext.getAssets().open("questions.db");
            outStream = new FileOutputStream(dbFilePath);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = inputStream.read(buffer))>0) {
                outStream.write(buffer, 0, length);
            }

            outStream.flush();
            outStream.close();
            inputStream.close();

        } catch(IOException e) {
            throw new Error("problem copying database from resource file");
        }
    }
}
我不确定的是如何保存是否尝试了一个问题(并防止在升级时被覆盖)。我的选择似乎是:

1) 为每个问题id保存一个布尔共享首选项(可能有很多SharedPref)

2) 创建一个单独的数据库来保存已回答问题的数据(似乎有些过分)

3) 将结果数据保存在同一数据库的单独表中,然后确保升级时只覆盖问题表

4) 将用户数据保留在问题表中自己的列中,但防止该列被覆盖

在上述四项中,4项似乎是最优雅的(尽管不确定是否可能)。最好的方法是什么(如果是选项3或4,我该如何修改代码?!)


非常感谢

如果要保留旧数据库中的数据,请使用SQL解析/读取两个数据库的记录。只有在旧数据库中插入新问题,才能通过“插入或更新”语句获取新数据库中的所有数据。

不行!由于SQLite数据库的结构,您不能自己更改其文件

但也许你必须选择:

  • 读取数据库中的所有内容,更改您的desire表,然后编写它
  • 将您的可重写表单独存储。(我知道这个解决方案是假的)

  • 你能突出你的问题吗?请注意,每次升级应用程序时,上面的代码都会覆盖整个数据库。问题是,这也会覆盖我从应用程序保存到该数据库中的任何内容。我的问题是如何只替换某些表或列,而不是删除整个表或列。您正在寻找这个吗?