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

时间:2018-01-29 08:32:46

标签: android mvvm

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

片段:

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

查看型号:

 public LiveData<User> getListItemById(String itemId){       
    return repository.getListItem(itemId);
}

存储库:

 public LiveData<User> getListItem(String itemId){
    return userDao.getUSerByID(itemId);
}

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?

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

2 个答案:

答案 0 :(得分:7)

Android Room code潜水后,我发现了一些事情:

  1. 会议室注释处理器使用javapoet

  2. 从会议室注释(@Query@Insert ...)生成代码
  3. 根据查询的结果类型(QueryMethodProcessor),它使用&#34; binder&#34;或另一个。对于LiveData,它使用LiveDataQueryResultBinder

  4. LiveDataQueryResultBinder生成一个LiveData类,其中包含InvalidationTracker.Observer类型的字段_observer,负责监听数据库更改。

  5. 然后,基本上,当数据库发生任何变化时,LiveData无效,并通知客户(您的存储库)。

答案 1 :(得分:0)

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

@Query("SELECT * FROM my_table")
public LiveData<List<MyItem>> changeNotif();

然后在您的活动中听这样的更改:

LiveData<List<MyItem>> items = AppDatabase.getAppDatabase().itemDao().changeNotif();
items.observe(this, new Observer<List<MyItem>>() {
    @Override
    public void onChanged(List<MyItem> myItems) {
    }
});