J'ai 2 APIs que je veux faire une demande en séquence et stocker leurs données dans SQLite.
Je veux d'abord faire une demande à l'API A
et stocker ses données dans la table SQL a
. Faites ensuite une demande à l'API B
et stockez ses données dans la table b
et certaines données dans la table a_b
. Les données stockées dans a_b
provient uniquement de la demande B
.
Comment puis-je faire cela en utilisant RxJava. J'ai lu quelque part sur l'utilisation de flatMap pour cela, quelque chose comme ça
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;
});
});
Si je n'utilisais pas les fonctions lambda, cela aurait l'air aussi moche que les appels imbriqués normaux. Est-ce une meilleure façon de procéder?
Je ne pense pas que l'utilisation de l'opérateur map
soit la meilleure façon d'aller avec des choses comme le stockage du résultat de l'appel api.
Ce que j'aime faire, c'est séparer ces choses à l'intérieur des opérateurs doOnNext
. Donc, votre exemple serait quelque chose comme ceci:
apiService.A()
.doOnNext(modelA -> db.store(modelA))
.flatMap(modelA -> apiService.B())
.doOnNext(modelB -> db.store(modelB));
(ajoutez vous-même observeOn
et subscribeOn
nécessaires, exactement comme vous en avez besoin)
Oui, vous pouvez utiliser le flatmap dans ce but précis. Voir l'exemple ci-dessous (en supposant que votre service A renvoie Observable<FooA>
et le service B renvoie 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
}
});