我正在学习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所有者中有数据已更改?
答案 0 :(得分:7)
在Android Room code潜水后,我发现了一些事情:
会议室注释处理器使用javapoet库
@Query
,@Insert
...)生成代码
根据查询的结果类型(QueryMethodProcessor),它使用&#34; binder&#34;或另一个。对于LiveData
,它使用LiveDataQueryResultBinder。
LiveDataQueryResultBinder
生成一个LiveData
类,其中包含InvalidationTracker.Observer类型的字段_observer
,负责监听数据库更改。
然后,基本上,当数据库发生任何变化时,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) {
}
});