Room fallbackToDestructiveMigrationFrom 无法正常工作如何解决
报错原因
两个报错均为配置不符合Room的校验规则导致:
- 传入
22到fallbackToDestructiveMigrationFrom时触发冲突:当前注册的FROM_21_TO_22迁移的结束版本为22,Room不允许同一个版本号同时作为手动迁移的起止版本、和破坏性迁移的起始版本,会直接判定配置矛盾。 - 传入
23到fallbackToDestructiveMigrationFrom时提示找不到迁移:fallbackToDestructiveMigrationFrom接收的参数是触发破坏性迁移的旧数据库版本号,传23意味着只有设备上的数据库版本为23、往更高版本升级时才走破坏性迁移。当前目标版本就是23,设备上旧版本为22,自然找不到对应迁移路径。
实现方案
你需要22升级到23时清空全量数据重建表,本质上所有低于23的版本升级到23时,旧数据都不需要保留——毕竟就算先把旧版本数据迁到22,升23时也会被全量删除,之前的迁移逻辑完全是无效运行,直接按以下步骤配置即可:
- 清空
addMigrations中传入的所有旧迁移对象,移除原来从FROM_14_TO_15到FROM_21_TO_22的所有配置 - 增加破坏性迁移配置,指定所有低于23的版本升级时走删库重建逻辑:
// 其余Room数据库配置保持不变 .addMigrations() .fallbackToDestructiveMigrationFrom(14,15,16,17,18,19,20,21,22)
- 确认
@Database注解的version属性已设置为23
配置完成后,所有设备上数据库版本低于23的用户升级时,都会直接清空原有表结构和数据,自动加载版本23对应的最新表结构,不会再抛出迁移相关报错。
- 后续升级更高数据库版本(如24)时,正常添加对应版本的手动迁移即可,不会影响本次22->23的破坏性迁移逻辑。
内容的提问来源于stack exchange,提问作者AndreiBogdan
相关产品推荐
相关产品推荐

