首页 > 解决方案 > 没有从数据库的 LiveData 观察者获取数据

问题描述

我想要的是

我有一个连接到 RecyclingView 的 Room 数据库,该数据库由一个查询填充,从一个月中选择所有数据。用户可以更改月份,我希望 RecyclingView 在用户每次更改月份时刷新数据。

问题

RecyclingView 获取起始月份的正确数据(在用户更改值之前)。但是在用户调用 onNextMonthClick 函数后,RecyclingView 是空的(下个月没问题),但即使我们回到原来的月份,它仍然是空的。

已经试过了

使用我的日志,我发现 onNextMonthClicked() 中的 onChange() 方法在当月有数据时永远不会触发,但如果本月没有数据就会触发。

如何再次加载我的数据?

month = Dates.getMonth();
mDiaryViewModel = new ViewModelProvider(this).get(DiaryViewModel.class);
mDiaryViewModel.getmEntriesMonth(month).observe(this, new Observer<List<Diary>>() {
        @Override
        public void onChanged(List<Diary> diaries) {
            adapter.setEntries(diaries);
        }
});


}
public void onNextMonthClick(View view) {
    if (month < 12) {
        month += 1;
    } else {
        month = 1;
    }
    adapter.setEntries(mDiaryViewModel.getmEntriesMonth((month)).getValue());
    mDiaryViewModel.getmEntriesMonth(month).observe(this, new Observer<List<Diary>>() {
        @Override
        public void onChanged(List<Diary> diaries) {
            adapter.setEntries(diaries);
        }
    });
}

整个代码可以在这里找到

标签: javaandroiddatabaseobservableandroid-room

解决方案


在您的代码中,您每次调用 onNextMonth 函数时都需要一个 LiveData,但您永远不会拔掉旧的 LiveData。所以你有不止一个观察者更新 RecyclerView。您应该保存当前的 LiveData 并在 onNextMonth 函数中,首先您应该删除它的观察者。编码

adapter.setEntries(mDiaryViewModel.getmEntriesMonth((month)).getValue());

无法工作,因为 LiveData 的值是异步更新的,请删除这行代码。最后一个建议是,如果您在 Fragment 中,您应该使用 viewLifecycle end 而不是 this 作为 LifecycleOwner:

  mDiaryViewModel.getmEntriesMonth(month).observe(getViewLifecycle(), new 
             Observer<List<Diary>>() {
    @Override
    public void onChanged(List<Diary> diaries) {
        adapter.setEntries(diaries);
    }
});

推荐阅读