Android Studio使用Room数据库无法正确更新条目字段问题求助
问题原因
- 缺少数据库更新操作:你仅修改了内存中缓存的
BoardItem对象,Room不会自动将内存对象的改动同步到数据库,必须主动调用更新接口才会触发数据库写入。 - 非LiveData的列表是一次性缓存:你在Repository构造方法中仅执行了一次查询将结果存入
boardItemListNow变量,后续数据库变动不会自动刷新这个缓存,每次调用拿到的都是ViewModel初始化时的旧数据。 - 现有DAO中没有定义条目更新方法,无法主动触发数据库更新操作。
修复步骤
1. 在DAO中新增更新方法
给BoardItemDAO接口添加@Update注解的更新方法:
@Update void updateBoardItem(BoardItem boardItem);
2. 调整Repository逻辑
删除一次性缓存的boardItemListNow变量,修改查询逻辑为每次调用实时取数,同时新增更新方法:
public class BoardItemRepository { private BoardItemDAO boardItemDAO; private LiveData<List<BoardItem>> boardItemList; public BoardItemRepository (Application application) { BoardItemDatabase db = BoardItemDatabase.getDatabase(application); boardItemDAO = db.boardItemDAO(); boardItemList = boardItemDAO.getBoardItems(); } public LiveData<List<BoardItem>> getBoardItemList() { return boardItemList; } public void addBoardItem(final BoardItem boardItem) { BoardItemDatabase.databaseWriteExecutor.execute(() -> boardItemDAO.addBoardItem(boardItem)); } // 每次调用都实时查询数据库最新数据 public List<BoardItem> getBoardItemListNow() { return boardItemDAO.getBoardItemsNow(); } // 新增更新条目方法 public void updateBoardItem(final BoardItem boardItem) { BoardItemDatabase.databaseWriteExecutor.execute(() -> boardItemDAO.updateBoardItem(boardItem)); } }
3. 调整ViewModel逻辑
删除缓存的boardItemsNow变量,新增调用Repository更新的方法:
public class BoardListViewModel extends AndroidViewModel { private final MutableLiveData<BoardItem> boardSelected = new MutableLiveData<>(); private LiveData<List<BoardItem>> boardItems; private BoardItemRepository repo; public BoardListViewModel(@NonNull Application application) { super(application); repo = new BoardItemRepository(application); boardItems = repo.getBoardItemList(); } public void select(BoardItem boardItem) { boardSelected.setValue(boardItem); } public LiveData<BoardItem> getSelected() { return boardSelected; } public LiveData<List<BoardItem>> getBoardItems() { return boardItems; } public BoardItem getBoardItem(int position) { return boardItems.getValue() == null ? null : boardItems.getValue().get(position); } // 实时查询最新数据 public List<BoardItem> getBoardItemsNow() { return repo.getBoardItemListNow(); } // 新增更新方法供页面调用 public void updateBoardItem(BoardItem boardItem) { repo.updateBoardItem(boardItem); } }
4. 修改按钮点击逻辑
修改完列表内容后主动调用更新方法同步到数据库:
List<BoardItem> boardItems = boardListViewModel.getBoardItemsNow(); BoardItem targetItem = boardItems.get(0); List<ImageItem> newList = targetItem.getBoardImageList(); newList.add(newItem); targetItem.setBoardImageList(newList); // 主动触发数据库更新 boardListViewModel.updateBoardItem(targetItem);
注意:你的board_id设置了自增属性,正常插入的第一条数据id为1而非0,你当前按倒序取第一条的逻辑是没问题的,后续如果需要按id精确查询需要注意这个规则。
内容的提问来源于stack exchange,提问作者Miriana
相关产品推荐
相关产品推荐

