我有两个API,我想按顺序发出请求并将它们的数据存储在SQLite中。
首先,我想向API A
发出请求,并将其数据存储在SQL表a
中。然后向API B
发出请求,并将其数据存储在表b
中,并将某些数据存储在表a_b
中。存储在a_b
中的数据仅来自请求B
。
如何使用RxJava执行此操作。我在这里阅读了有关使用flatMap的内容,就像这样
apiService.A()
// store in DB here? How? maybe use map()?
.flatMap(modelA -> {
// or maybe store modelA in DB here?
return apiService.B().map(modelB -> {
storeInDB()l // store B here ?
return modelB;
});
});
如果我没有使用lambda函数,这看起来就像普通的嵌套调用一样难看。这是一个更好的方法吗?
答案 0 :(得分:22)
我不认为使用map
运算符是存储api调用结果等内容的最佳方式。
我喜欢做的是将doOnNext
运算符中的内容分开。所以你的例子是这样的:
apiService.A()
.doOnNext(modelA -> db.store(modelA))
.flatMap(modelA -> apiService.B())
.doOnNext(modelB -> db.store(modelB));
(自己添加必要的observeOn
和subscribeOn
,就像您需要的那样)
答案 1 :(得分:21)
是的,您可以将flatmap用于此目的。请参阅以下示例(假设您的服务A返回Observable<FooA>
而服务B返回Observable<FooB>
)
api.serviceA()
.flatMap(new Func1<FooA, Observable<FooB>>() {
@Override
public Observable<FooB> call(FooA fooA) {
// code to save data from service A to db
// call service B
return api.serviceB();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<FooB>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(FooB fooB) {
// code to save data from service B to db
}
});