打开APP,直接Crash了,查看logcat,提示数据库版本不能进行降级.
(WTF…我明明是拿同一个数据库进行操作,并没有进行升级操作.)
解决办法:
PRAGMA user_version
查看需要迁移的数据库版本,发现版本号果然比代码内数据库版本高1.
PRAGMA user_version=?
?表示你需要设置的数据库版本号.
迁移数据库版本号改为0,下载数据中出现ANR
adb pull data/trace导出ANR文件信息,发现是VMThread.wait()等待同步锁的释放导致ANR,查看代码,发现是由于未执行更新数据库操作,没有及时更新索引,导致查询超时.
解决办法:
查看SQLiteOpenHeler源码,发现在初始化数据库时,调用构造函数,传入4个参数 context,name,factory,version,再调用getReadableDatabase() 后调用 getDatabaseLocked() 函数内有相关逻辑处理,因 version==0.直接执行 **onCreate()**方法没有执行更新数据库的操作导致.
通过 PRAGMA user_version=1将需要迁移的数据库版本改为1,将创建其他表结构/新增索引等操作放
在 **onUpgrade()**内执行.
最终能够保证 数据迁移后,维持原有数据库表结构,数据库正常的更新升级.
踩坑途中遇到这个异常.
java.lang.IllegalStateException: Cannot perform this operation because there is no current transaction
strackoverflow上面没有找到满意的答案,最后断点调试,发现异常原因是: SQL的语法问题 …