我正在为 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,我该如何修改代码?!)
非常感激!