更新Android Room数据库出现UNIQUE constraint failed错误如何解决?
问题根因
你当前触发的不是更新操作,而是插入操作。从报错堆栈可以明确看到调用链最终走的是insertPlant方法:当你给Plant对象传入了数据库中已存在的plant_id执行插入时,主键的唯一约束冲突就会抛出这个错误。
修复方案
- 首先定位
Edit_Plant.kt第98行的保存按钮点击逻辑,你现在写的是调用viewModel.insertPlant(),改成调用viewModel.updatePlant()即可 - 如果你的编辑页需要同时兼容新增和编辑两种场景,可以加判断逻辑:
// plant对象的plant_id为0时代表是新增条目(autoGenerate主键默认未赋值时为0) if (plant.plant_id == 0L) { plantViewModel.insertPlant(plant) } else { plantViewModel.updatePlant(plant) }
补充说明
- Room的
@Update注解操作必须依赖实体类的主键匹配要修改的条目,所以更新时必须携带数据库中已存在的唯一id,你当前Dao层的updatePlant配置(onConflict = OnConflictStrategy.REPLACE)是符合要求的 - 你的INSERT功能正常是因为新增时你没有给
plant_id赋值,Room会自动生成不重复的主键id,不会触发冲突
内容的提问来源于stack exchange,提问作者Edita Komarova
相关产品推荐
相关产品推荐

