Android Room执行update更新Task时生成重复数据问题
问题原因
更新生成重复条目、ID赋值不生效是三个代码错误导致的:
updateTask方法中oldTask = updatedTask是Java引用重定向操作,执行完这行后本地变量oldTask不再指向从数据库查出的原有任务,而是直接指向你新创建的updatedTask对象。后续调用oldTask.getTaskID()拿到的是新对象的int默认值0,根本不是数据库里原有任务的主键ID。- 传入
updateTask的参数taskPosition是列表展示的位置索引,不是任务的主键taskID。列表位置会随着排序、删除操作动态变化,和数据库自增生成的主键没有对应关系,用这个值当条件查getTask()从一开始就拿不到正确的旧任务。 Task实体类的setter方法存在书写错误:setTaskDate参数类型和字段类型不匹配,setTaskTime内部错误给taskDate字段赋值,后续更新时间会直接污染日期数据。
修复方案
- 修正
updateTask方法逻辑,去掉无意义的引用赋值,正确获取旧任务主键后再执行更新:
// 注意第二个参数传任务真实主键ID,不要传列表位置 public void updateTask(Task updatedTask, int taskId) { Task oldTask = appDataBase.taskDao().getTask(taskId); if (oldTask != null) { // 把数据库中原有任务的ID设置到新对象上,让Room能匹配到要更新的行 updatedTask.setTaskID(oldTask.getTaskID()); appDataBase.taskDao().updateTask(updatedTask); } }
- 修正页面跳转传参逻辑:从列表进入编辑页时,不要传列表项的位置值,直接传对应任务对象的
taskID字段值,确保查询旧任务时用的是真实主键。 - 修复
Task实体类中写错的setter方法,统一参数类型和赋值目标:
// 修正setTaskDate:参数类型和字段保持一致,赋值给对应字段 public void setTaskDate(String newDate) { this.taskDate = newDate; } // 修正setTaskTime:赋值给taskTime字段,不要误改taskDate public void setTaskTime(String newTime) { this.taskTime = newTime; }
补充说明:Room的@Update注解默认以实体类的主键作为匹配依据,只要传入的对象主键值和数据库中已有记录的主键一致,就会更新对应行,不会生成新的重复条目。如果修复后仍出现重复,检查更新逻辑分支中是否误调用了insertTask方法。
内容的提问来源于stack exchange,提问作者HoLoGram
相关产品推荐
相关产品推荐

