Android预打包数据库更新
我正在为android开发一个测验类型的应用程序,目标是随着时间的推移能够扩展题库。为此,我正在预打包SQLite数据库,并检查更新,并在升级时覆盖它: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
@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数据库的结构,您不能自己更改其文件 但也许你必须选择:
你能突出你的问题吗?请注意,每次升级应用程序时,上面的代码都会覆盖整个数据库。问题是,这也会覆盖我从应用程序保存到该数据库中的任何内容。我的问题是如何只替换某些表或列,而不是删除整个表或列。您正在寻找这个吗?