我正在为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保存一个布尔共享首选项(可能是很多共享首选项)
2)创建一个单独的数据库来保存已回答问题的数据(看起来有点过分)
3)将结果数据保存在同一数据库的单独表中,然后确保在升级时只覆盖问题表
4)将用户数据保存在问题表中的自己的列中,但阻止该列被覆盖。
在上面,4似乎是最优雅的(虽然不确定,如果可能)。实现它的最佳方式是什么(如果它是选项3或4,我该如何修改代码?!)
非常感谢!
答案 0 :(得分:0)
如果要保留旧数据库中的数据,请使用SQL来解析/读取两个数据库的记录。只在旧数据库中插入新问题,因此通过“INSERT OR UPDATE”语句获取新数据库的所有数据。
答案 1 :(得分:0)
没办法!因为SQLite数据库的结构你不能自己改变它的文件
但也许你必须选择: