Android LiveData如何知道房间数据库中的数据何时更改?

Android LiveData如何知道房间数据库中的数据何时更改?,android,mvvm,Android,Mvvm,我正在学习android中的Mvvm模式,但我不明白一件事。实时数据如何知道房间数据库中的数据何时发生更改?我有以下代码: 片段: newUserViewModel.getListItemById(itemId).observe(this, new Observer<User>() { @Override public void onChanged(@Nullable User user) { tv.setText(user.

我正在学习android中的Mvvm模式,但我不明白一件事。实时数据如何知道房间数据库中的数据何时发生更改?我有以下代码:

片段:

 newUserViewModel.getListItemById(itemId).observe(this, new Observer<User>() {
        @Override
        public void onChanged(@Nullable User user) {
            tv.setText(user.getName());
        }
    });
newUserViewModel.getListItemById(itemId).observe(这是新的观察者(){
@凌驾
公共void onChanged(@Nullable User){
tv.setText(user.getName());
}
});
视图模型:

 public LiveData<User> getListItemById(String itemId){       
    return repository.getListItem(itemId);
}
公共LiveData getListItemById(String itemId){ 返回repository.getListItem(itemId); } 存储库:

 public LiveData<User> getListItem(String itemId){
    return userDao.getUSerByID(itemId);
}
公共LiveData getListItem(字符串itemId){ 返回userDao.getUSerByID(itemId); } 道:

@Query(“从用户中选择*,其中itemId=:itemId”)
LiveData getUSerByID(字符串itemId);//当执行此查询时,实时数据如何知道表已更改?
假设我们在数据库中插入了新用户。
@Query(“SELECT*FROM User WHERE itemId=:itemId”)
在数据库中有新数据时何时执行?)以及LiveData如何知道表中有新用户,以及数据已更改的回调观察者所有者?

在深入研究之后,我发现了一些事情:

  • 房间批注处理器使用库从房间批注(
    @Query
    @Insert
    …)生成代码

  • 根据查询()的结果类型,它使用一个“活页夹”或另一个活页夹。对于
    LiveData
    ,它使用

  • LiveDataQueryResultBinder
    生成一个
    LiveData
    类,该类包含一个类型为的字段
    \u observer
    ,负责侦听数据库更改


  • 然后,基本上,当数据库发生任何更改时,
    LiveData
    将失效,并通知客户端(您的存储库)。

    向Dao添加一个仅用于通知的查询,例如:

    @Query("SELECT * FROM my_table")
    public LiveData<List<MyItem>> changeNotif();
    
    @Query(“从我的表格中选择*)
    public LiveData changeNotif();
    
    然后在你的活动中聆听如下变化:

    LiveData<List<MyItem>> items = AppDatabase.getAppDatabase().itemDao().changeNotif();
    items.observe(this, new Observer<List<MyItem>>() {
        @Override
        public void onChanged(List<MyItem> myItems) {
        }
    });
    
    LiveData items=AppDatabase.getAppDatabase().itemDao().changeNotif();
    观察项目(本,新观察者(){
    @凌驾
    更改后的公共void(列出myItems){
    }
    });
    
    因为在内部,Room存储了观察者,并在INSERT语句之后通过LiveData通知他们OK,现在有意义了,非常感谢您的帮助。您可以将此评论作为答案,以便我检查。您能否澄清“通过LiveData通知他们”的工作流程?那么插入是如何完成的,在这种情况下,LiveData是如何通知观察者的?使用某种回调方法?在通知观测者调用之后:newUserViewModel.getListItemById(itemId)。顺便说一下,根据文档,您不应该从视图模型调用repository.getListItem。对于某些条件查询,它不是很有效吗?例如,我只是拉取一个子集来填充我的ListView,但是每当插入任何不相关的数据时,我的观察LiveData就会失效,然后ListView就会被重新填充。但是它怎么知道有更新呢?它使用投票吗?这根本不能回答问题。问题不是问API的用法,而是问它在内部是如何工作的
    LiveData<List<MyItem>> items = AppDatabase.getAppDatabase().itemDao().changeNotif();
    items.observe(this, new Observer<List<MyItem>>() {
        @Override
        public void onChanged(List<MyItem> myItems) {
        }
    });