在更新apk时如果有动到db的结构或者是里面预设值的话,在进行apk版本更新安装升级时,无法将现有db替换为新版中的db
另外用户在使用apk时,会在db中写入一些数据,如果升级安装后通过在设定中清除资料的方式将现有db删除再导入的话,
虽然可以导入新的db但是用户资料就会被删除。在使用时非常不变。
程式在开始设计时没有考虑到用户会要修改db,遇到db有更新时,都是让用户通过清除资料的方式处理。
db的导入使用复制assets中整个db的资料的方式,并非动态创建。
解决方法:
在onUpgrade中,将现有db中用户添加的内容备份,之后利用文件操作删除整个db文件,拷贝新版文件到db路径中,将之前备份的内容写入。
在修改过程中遇到两个问题。
1.onUpgrade中,无法进行select处理,提示数据表被锁。
使用的是db.query和db.rawQuery方式,后来有看到资料说是由于db = this.getWritableDatabase();
应该使用getReadableDatabase()。不知道是否可行。
後來發現也可能是因为没有使用onUpgrade中的db对象,或者SDK的版本的问题???只是没有时间再试。。。。。
于是想到一个很笨的方法,在onUpgrade中,只利用db.execSQL在现有db中添加一行。然后在程式启动时读db进行判断,
如果有这一行的话,代表db有更新,然后进行相应处理。
成功更新db。
不过又遇到了第二个问题:
2.如果新版本的db版本号大于旧版本的话,可以正常执行onUpgrade方法,
不过如果在特殊情况下需要替换回旧版本的话,就会发生exception,
android.database.sqlite.SQLiteException: Can't downgrade database from version 2 to 1
后来爬文找到,原来在level 11的版本中就有提供一个onDownGrade的方法。于是换成的SDK 4.03,看到此方法。
至此,问题全部解决,只是并不完美,等有时间的时候再来进行修改吧。