Android中Room数据库在Play Store更新后的行为及数据更新疑问
Room预填充数据库更新后的行为说明
核心结论
当现有用户从Play Store更新应用后:
data/data/包名/...目录下的.db、.db-shm、.db-wal文件不会被替换,会完整保留更新前的旧内容- 用户看到的依然是本地旧数据,不会自动加载assets目录里更新后的新数据
原因分析
Room的createFromAsset()方法默认逻辑是:仅在首次安装应用、本地不存在目标数据库文件时,才会将assets中的数据库复制到应用私有存储目录。后续应用更新时,只要本地已经存在这三个数据库文件,Room就会直接复用现有文件,不会再从assets重新复制新的数据库资源。
让用户获取更新后数据的可行方案
由于你的场景中用户无法修改数据库内容,可通过以下两种方式实现数据更新:
方案1:版本号升级+破坏性重建
- 提升Room数据库类
@Database注解中的version值(比如从1改为2) - 在
@Database注解中添加fallbackToDestructiveMigration = true参数 - 用户更新应用后,Room检测到版本号提升且无对应Migration逻辑时,会自动删除本地旧的三个数据库文件,重新从assets复制最新的数据库,用户即可看到更新后的数据。
方案2:手动校验版本并替换数据库
- 在预填充数据库中新增一张
db_version表,专门存储当前数据库的内容版本号 - 应用启动时,先查询本地数据库的版本号,再通过
AssetManager打开assets里的数据库文件,读取其中的版本号 - 如果本地版本低于assets中的版本,就删除本地的
.db、.db-shm、.db-wal文件,触发Room重新从assets复制最新数据库。
内容的提问来源于stack exchange,提问作者Nemanja
相关产品推荐
相关产品推荐

