Room未更新现有预设数据库 移除字段唯一约束后仍报错如何解决
问题原因及解决步骤
你遇到的报错是因为Room的schema校验逻辑和预设数据库修改不完整导致,常见的遗漏操作如下:
- 没有同步修改Room对应的
Driver实体类注解:如果你在drivingLicNum字段上标注了@ColumnInfo(unique = true),或是在类头部的@Table注解的uniqueConstraints参数中配置了该字段的唯一约束,哪怕你修改了预设数据库的建表语句,Room在初始化时会按照实体类配置校验数据库schema,匹配失败就会报错,甚至会自动给字段加回唯一约束。 - assets目录下的预设数据库文件没有正确更新:SQLite不支持直接修改字段删除约束,你不能仅修改建表语句就完成约束移除,需要执行「新建无约束的Driver表→导入旧数据→删除旧表→重命名新表」的完整流程,才能真正把约束从db文件中删除。修改完成后要确认打包到APK里的
assets/databases/myprefdefdb.db是最新版本,可以解压APK后用SQLite工具打开直接检查表结构确认。 - 没有升级Room数据库的版本号:哪怕你开启了
fallbackToDestructiveMigration,如果@Database注解中的version值没有升级,Room会判定数据库无需变更,不会触发重新从asset加载数据库的逻辑。建议你将版本号加1后重新编译运行。
内容的提问来源于stack exchange,提问作者igodie
相关产品推荐
相关产品推荐

