我在房间db中有一张桌子,其中包含卡片列表。我的片段中有2个回收站视图。需要根据卡ID填充这些回收者视图。只要此表中有更改,实时数据就会为两个回收者视图提供回调。相反,我想如果该特定卡d被更新,则只有实时数据才能更新我的UI。现在,如果有任何id数据正在更新,我将获得两个回收者视图的回调。例如,如果传递的d是“ Sbi”,则如果sbi数据行中有更改,则仅更新第一个回收者视图,而不更新第二个回收者视图。另外,如果传递的ID为“ sbi”,则暂时忽略其他ID中的更新。
活动
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
myViewModel.getFirstData("Sbi")).observe(this,
result -> {
myFirstAdapter.addList(result);
});
myViewModel.getSecondData("Sbi1").observe(this,
result -> {
mySecondAdapter.addList(result);
});
}
MyViewModel
public LiveData<List<MyModel>> getFirstData(String cardId) {
return myDao.getItems(cardId);
}
public LiveData<List<MyModel>> getSecondData(String cardDetailId) {
return myDao.getItems(cardDetailId);
}
当您将Room与LiveData一起使用时-Room-framework会生成一些低层的样板代码,当表中发生某些更改时,这些代码将负责调用该魔术“回调”。看起来像一个:
mObserver = new InvalidationTracker.Observer(tableNames) {...
根据documentation,此方法“将给定的观察者添加到观察者列表中,如果它观察到的任何表发生更改,它将被通知”。据我了解,Room不会打开某些“智能模式”来分析特定查询的参数(在您的情况下为“ where id:= ...”),并且只要表发生更改,它就会调用您的watch-LiveData回调,无论您在LiveData函数中提到什么ID。换句话说,如果您使用Room,则在关联的sqlite-table进行每次更改时,您都将进行两次观察回调。