我正在使用RxJava,Room和Retrofit在Android中完成存储库模式。除了这一件事,一切都在工作。我已经实现了SearchView
来搜索数据。现在,当搜索视图文本更改时,我将调用搜索方法。这是它的样子
mLocal.searchMovies(query) //returns Single
mRemote.searchMovies(query) //returns Single
public Single<List<MovieEntity>> search(String query) {
return mLocal.searchMovies(query)
.toMaybe()
.switchIfEmpty(mRemote.searchMovies(query)
.map(data -> {
mLocal.saveAll(data);
return data;
}));
}
mLocal
查询会议室数据库,并且mRemote
调用改造以从REST API中获取数据。问题是,这仅调用mLocal,并且当房间返回空行时不会启动网络调用。我已经尝试了所有可能的东西,并阅读了许多文章,但是我不明白如何使它工作。mLocal和mRemote都可以正常工作。仅链接它们并不能实现我想要的功能。
最佳答案
您的链条不起作用,因为.toMaybe()
中的Single
无法产生Maybe.empty()
,这是使.switchIfEmpty
生效所需的结果。
您可能需要用Single.onErrorResume
替换它,以便缺少条目的错误情况导致远程查询,或者使其返回Maybe
以准确表示<Result,NotCached,Error>
的三态。