RxJava在数据库为空时调用网络

RxJava在数据库为空时调用网络,java,android,rx-java2,Java,Android,Rx Java2,我正在使用RxJava、Room和改装来完成Android中的存储库模式。除了这件事,一切都在运转。我已经实现了搜索数据的SearchView。现在,当搜索视图文本更改时,我调用搜索方法。下面是它的样子 mLocal.searchMovies(query) //returns Single mRemote.searchMovies(query) //returns Single public Single<List<MovieEntity>> search(String

我正在使用RxJava、Room和改装来完成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.searchMovies(查询)//返回单个
mRemote.searchMovies(query)//返回单个
公共单一搜索(字符串查询){
返回mLocal.searchMovies(查询)
.toMaybe()
.switchIfEmpty(mRemote.searchMovies(查询)
.map(数据->{
本地保存所有(数据);
返回数据;
}));
}
mLocal
查询房间数据库,并
mRemote
调用reformation从RESTAPI获取数据。问题是,这只调用mLocal,当房间返回空行时,不会启动网络调用。我已经尝试了我可能的一切,读了很多文章,但我不明白如何让它工作


mLocal和mRemote都可以正常工作。只有链接它们并不能达到我想要的效果。

您的链接不起作用,因为
中的
.toMaybe()
无法生成
Maybe.empty()
,这是
生效所需的结果


您需要将其替换为
Single.onErrorResume
,以使丢失条目的错误条件导致远程查询,或者使其返回
Maybe
,以准确表示

的三态。我的问题的解释与中的相同。我将复制相关部分,并在应用后发布我的工作代码

注:我已从单一/可能更改为可流动。我不确定它对原始代码的影响有多大,如果我没有改变可观察对象的类型

根据OP的反馈,allDatas源是无限的,但是 返回了一个空列表。该决议至少适用于第(1)条 从所有数据中只获取一个响应,然后选择筛选 退出空列表,以便switchIfEmpty可以切换到 替代品

public-Flowable-getMovies(){
返回mLocal.allMovies().take(1)
.filter(list->!list.isEmpty())
.switchIfEmpty(mRemote.allMovies()
.doOnNext(数据->本地.saveAll(数据))
);
}
public Flowable<List<MovieEntity>> getMovies() {
        return mLocal.allMovies().take(1)
                .filter(list -> !list.isEmpty())
                .switchIfEmpty(mRemote.allMovies()
                                .doOnNext(data -> mLocal.saveAll(data))
                        );
    }