Android SQLite新增列后恢复云端旧备份的onUpgrade触发问题
Android SQLite 版本升级相关问题解答
一、onUpgrade 执行时机
onUpgrade 既不是仅在应用启动时触发,也不是所有数据库操作都会触发,它的触发条件非常明确:
- 只有调用
SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取数据库实例时,系统才会校验数据库文件头中存储的实际版本号,和代码中配置的目标版本号:- 若实际版本号 < 目标版本号,自动执行
onUpgrade逻辑 - 若实际版本号 > 目标版本号,自动执行
onDowngrade逻辑(默认空实现会直接抛出异常)
- 若实际版本号 < 目标版本号,自动执行
二、云端恢复旧备份后的升级行为
不需要你在恢复完成后主动触发升级,逻辑如下:
- 你从Google Drive恢复的旧备份数据库文件,头部存储的是旧版本号,替换本地数据库文件后,本地数据库的实际版本号会回退到旧版本
- 当恢复完成后第一次调用
getWritableDatabase()/getReadableDatabase()时,系统会自动检测到版本差异,执行你已经写好的ALTER TABLE新增gender字段的逻辑,和本地升级的效果完全一致
可选优化建议:恢复备份完成后可以主动调用一次
getWritableDatabase()提前完成升级,避免后续业务操作时触发升级导致的卡顿或者异常
内容的提问来源于stack exchange,提问作者Darksymphony
相关产品推荐
相关产品推荐

