Android记事本App新建笔记后无法即时保存后续修改问题求助
问题分析与解决方案
嘿,我仔细看了你的代码,很快就定位到问题啦!
问题根源
你遇到的新建笔记首次保存后无法直接修改保存的核心原因是:Room在插入带自动生成主键的实体时,不会自动把生成的ID回写到你传入的temp对象里。
具体逻辑链是这样的:
- 新建笔记时,
temp是你手动new出来的,此时它的id是int类型的默认值0 - 调用
dao.insertNote(temp)后,数据库确实新增了一条笔记,Room也自动生成了有效的主键ID(比如1、2这类) - 但你的
temp对象的id依然是0,没有被同步更新 - 后续修改内容调用
updateNote(temp)时,Room会根据temp.id=0去数据库查找对应记录,自然找不到,所以更新操作相当于无效 - 而重新打开笔记时,你通过
dao.getNoteById(id)从数据库拿到了带有正确ID的temp对象,所以后续修改能正常保存
修复步骤
1. 修改NotesDao的insertNote方法,让它返回插入后的主键ID
Room的@Insert方法支持返回插入实体的主键值,我们需要把返回类型从void改成long:
@Dao public interface NotesDao { // 将返回类型改为long,用于获取自动生成的主键ID @Insert(onConflict = OnConflictStrategy.REPLACE) long insertNote(Note note); // 其他方法保持不变... }
2. 在EditNoteActivity的onSaveNote方法中,把返回的ID赋值给temp
插入笔记后,将Room返回的ID设置到temp对象里,这样后续的更新操作就能找到正确的数据库记录了:
private void onSaveNote() { String text = inputNote.getText().toString(); if (!text.isEmpty()) { long date = new Date().getTime(); if (temp == null) { temp = new Note(text, date, 0); // 获取插入后的主键ID,并赋值给temp long insertedId = dao.insertNote(temp); temp.setId((int) insertedId); } else { temp.setNoteText(text); temp.setNoteDate(date); dao.updateNote(temp); } Toast.makeText(this, getString(R.string.notaSalva), Toast.LENGTH_SHORT).show(); } else Toast.makeText(this, getString(R.string.introduzTexto), Toast.LENGTH_SHORT).show(); }
3. 给Note类补充setId和getId方法
看你提供的Note类代码,目前缺少ID的setter方法,需要补充:
public class Note { // 现有代码... public void setId(int id) { this.id = id; } // 同时补充getId方法,方便其他场景获取ID public int getId() { return id; } }
验证效果
修改完成后,新建笔记第一次保存后,直接修改内容再点击保存,就能正常同步到数据库了,不需要关闭再重新打开~
内容的提问来源于stack exchange,提问作者ddeveloper
相关产品推荐
相关产品推荐

