Essayer de tester la nouvelle bibliothèque Android Room avec l'adaptateur RxJava. Et je veux gérer le résultat si ma requête renvoie 0 objet de la base de données:
Alors voici la méthode DAO:
@Query("SELECT * FROM auth_info")
fun getAuthInfo(): Flowable<AuthResponse>
Et comment je le gère:
database.authDao().getAuthInfo()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.switchIfEmpty { Log.d(TAG, "IS EMPTY") }
.firstOrError()
.subscribe(
{ authResponse -> Log.d(TAG, authResponse.token) },
{ error -> Log.d(TAG, error.message) })
Ma base de données est vide, je suppose donc que .switchIfEmty () fonctionnera, mais aucune des méthodes de traitement ne se déclenche. Ni .subscribe () ni .switchIfEmpty ()
Les Db Flowables sont observables (ils gardent donc la distribution si la base de données change) pour ne jamais se terminer. Vous pouvez essayer de renvoyer List<AuthResponse>
. Nous avons envisagé le portage facultatif mais nous avons décidé de ne pas le faire, du moins pour le moment. Au lieu de cela, nous allons probablement ajouter un support pour Optional dans différentes bibliothèques connues.
Dans la version 1.0.0-alpha5, la salle a ajouté la prise en charge de Maybe
et Single
aux DAO, de sorte que vous pouvez maintenant écrire quelque chose comme:
@Query("SELECT * FROM auth_info")
fun getAuthInfo(): Maybe<AuthResponse>
Vous pouvez en lire plus à ce sujet ici
Vous pouvez utiliser un wrapper pour le résultat. Par exemple:
public Single<QueryResult<Transaction>> getTransaction(long id) {
return createSingle(() -> database.getTransactionDao().getTransaction(id))
.map(QueryResult::new);
}
public class QueryResult<D> {
public D data;
public QueryResult() {}
public QueryResult(D data) {
this.data = data;
}
public boolean isEmpty(){
return data != null;
}
}
protected <T> Single<T> createSingle(final Callable<T> func) {
return Single.create(emitter -> {
try {
T result = func.call();
emitter.onSuccess(result);
} catch (Exception ex) {
Log.e("TAG", "Error of operation with db");
}
});
}
Et utilisez-le comme 'Single' dans ce cas, vous obtiendrez un résultat dans tous les cas. Utilisation:
dbStorage.getTransaction(selectedCoin.getId())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(r -> {
if(!r.isEmpty()){
// we have some data from DB
} else {
}
})
switchIfEmpty
prend en paramètre un Publisher<AuthResponse>
. Grâce à la conversion SAM, votre fonction anonyme donnée est transformée en cette classe. Cependant, il ne suit pas le comportement attendu d'une Publisher
et ne fonctionnera donc pas comme prévu.
Remplacez-le par une implémentation correcte telle que Flowable.empty().doOnSubscribe { Log.d(TAG, "IS EMPTY") }
et cela devrait fonctionner.