1

我正在为 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 保存一个布尔共享首选项(可能有很多 sharedprefs)

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

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

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

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

非常感激!

4

2 回答 2

0

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

于 2012-06-07T21:31:22.073 回答
0

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

但也许你必须选择:

  1. 读取所有数据库,更改您想要的表然后编写它。
  2. 将您的可重写表分开存储。(这个解决方案是假的,我知道)
于 2012-06-07T21:33:21.717 回答