Android Room Auto Migration新增列失效,defaultValue异常问题求助
问题根源
该异常是Room自动迁移生成的SQL语句未正确识别字符串类型默认值导致的。@ColumnInfo的defaultValue属性接收的是原生SQL语法的常量值,字符串类型常量在SQL中必须用单引号包裹,你直接写defaultValue = "NOT_NOTIFIED"时,Room拼接SQL时会将其识别为未加引号的标识符,最终导致默认值设置失效,生成的列默认值为NULL,和预期不匹配触发迁移校验失败。
修复步骤
- 修正实体类字段的注解配置,给字符串默认值外层加单引号:
@ColumnInfo(name = "notified", defaultValue = "'NOT_NOTIFIED'") public String notified = "NOT_NOTIFIED";
- 清理项目中旧版本的schema导出文件,删除之前生成的版本2的schema文件,执行
Clean Project后再执行Rebuild Project,让Room重新生成正确的自动迁移逻辑和新版本schema文件。 - 验证生成的schema是否正确:打开你gradle配置的
schemaLocation对应目录下的2.json文件,查找notified列的定义,确认其defaultValue字段为'NOT_NOTIFIED'。 - 测试前卸载设备上已安装的旧测试包(或清除应用数据),避免设备上残留之前迁移错误生成的版本2数据库,导致重复报错。
注意:请确认你的Database类注解配置正确,已声明1到2版本的自动迁移规则,且exportSchema开关为开启状态。
内容的提问来源于stack exchange,提问作者Shadow
相关产品推荐
相关产品推荐

