这是我第一次使用Room和RxJava。当我从数据库中读取数据时,得到的结果非常不一致。我有一个嵌套的RecyclerView,其中第一个只显示星期几,第二个显示每天的预报。
有时,当我启动该应用程序时,所有内容都会立即显示出来。在其他时间,仅显示日期,而不显示每天的预测。其他时间,没有显示RecyclerViews。但是,如果我使用Stetho查看数据库,则数据位于设备内。
这是我设置Dao的方式:
@Dao
public interface MyDao {
// Other CRUD methods
@Query("SELECT DISTINCT date FROM my_table")
Single<List<LocalDate>> getUniqueDays();
@Query("SELECT * FROM my_table WHERE date == :localDate")
Single<List<Forecasts>> getForecastForDay(LocalDate localDate);
}
我使用以下命令填充第一个RecyclerView:
Single<List<LocalDate>> source = MyApp.getDatabase().getDao().getUniqueDays();
source.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<List<LocalDate>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(List<LocalDate> localDates) {
mAdapter.refreshData(localDates);
}
@Override
public void onError(Throwable e) {
}
});
这在显示星期几的片段中被调用。
然后,在一周中的几天之内,我还需要在适配器中填充内部RecyclerView,该操作是在ViewHolder的bind()
中完成的:
public void bind(LocalDate date, int position){
// A bunch of other views being set
mHourlyForecasts.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false);
mHourlyForecasts.setLayoutManager(layoutManager);
mAdapter = new HourlyForecastAdapter(mContext);
mHourlyForecasts.setAdapter(mAdapter);
Single<List<Forecasts>> source = MyApp.getDatabase().getDao().getForecastForDay(date);
source.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<List<Forecasts>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(List<Forecasts> conditions) {
Timber.i("Size of conditions in onSuccess(): %d", conditions.size());
mAdapter.refreshData(conditions);
}
@Override
public void onError(Throwable e) {
}
});
}
但是,我不知道为什么数据不能一直显示。有时在启动时不显示数据,有时却不显示。有时,我会关闭应用程序并重新打开它,但缺少一些数据。或全部都在那里。再说一次,当我在Stetho中检查设备时,数据就存在于数据库中,只是没有在RecyclerView中显示。
如果有人可以提供一些指导,将不胜感激...