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

Nik*_*zic 10 android mvvm

我在android中学习Mvvm模式,我不明白一件事.实时数据如何知道房间数据库中数据何时发生变化?我有这个代码:

分段:

 newUserViewModel.getListItemById(itemId).observe(this, new Observer<User>() {
        @Override
        public void onChanged(@Nullable User user) {
            tv.setText(user.getName());
        }
    });
Run Code Online (Sandbox Code Playgroud)

查看型号:

 public LiveData<User> getListItemById(String itemId){       
    return repository.getListItem(itemId);
}
Run Code Online (Sandbox Code Playgroud)

库:

 public LiveData<User> getListItem(String itemId){
    return userDao.getUSerByID(itemId);
}
Run Code Online (Sandbox Code Playgroud)

DAO:

@Query("SELECT * FROM User WHERE itemId = :itemId")
LiveData<User> getUSerByID(String itemId);// When this query gets executed and how live Data knows that our Table is changed?
Run Code Online (Sandbox Code Playgroud)

假设我们在数据库中插入了新用户.什么@Query("SELECT * FROM User WHERE itemId = :itemId")时候在我们的数据库中有新数据时执行?)以及LiveData如何知道我们在表中有新用户和回调Observer所有者数据已经改变了?

Héc*_*tor 14

Android Room代码中潜水后,我发现了一些东西:

  1. Room annotation处理器使用javapoet库从Room annotations(@Query,@Insert...)生成代码

  2. 根据查询的结果类型(QueryMethodProcessor),它使用"binder"或另一个.在这种情况下LiveData,它使用LiveDataQueryResultBinder.

  3. LiveDataQueryResultBinder生成一个LiveData包含InvalidationTracker.Observer_observer类型字段的类,负责监听数据库更改.

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