web-dev-qa-db-fra.com

Comment faire une requête sur une seule ligne avec Android Room

Comment puis-je effectuer une requête sur une seule ligne avec Android Room avec RxJava? Je peux interroger la liste des éléments, aucun problème. Ici, je veux savoir si une ligne spécifique existe. Selon les documents, on dirait que je peux retourner Single et vérifier l'exception EmptyResultSetException si aucune ligne n'existe.

Je peux avoir quelque chose comme:

@Query("SELECT * FROM Users WHERE userId = :id LIMIT 1")
Single<User> findByUserId(String userId);

Comment utiliser cet appel? Il semble qu'il y ait des onError/onSuccess mais ne peut pas trouver ces méthodes sur Single <>.

usersDao.findByUserId("xxx").???

Tout exemple de travail sera génial!

8
srvy

Selon les documents, il semble que je puisse retourner Single et vérifier l'exception EmptyResultSetException si aucune ligne n'existe.

Ou, renvoyez simplement User, si vous gérez votre thread d'arrière-plan par d'autres moyens.

@Query("SELECT * FROM Users WHERE userId = :id")
User findByUserId(String id);

Comment utiliser cet appel?

usersDao.findByUserId("xxx")
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(user -> { ... }, error -> { ... });

Ici, je montre subscribe() prenant deux expressions lambda, pour le User et l'erreur. Vous pouvez utiliser à la place deux objets Consumer. Je suppose également que vous avez rxandroid comme dépendance, pour AndroidSchedulers.mainThread(), et que vous voulez que le User vous soit livré sur ce thread.

IOW, vous l'utilisez de la même manière que vous utilisez n'importe quel autre Single de RxJava. Les détails varieront en fonction de vos besoins.

10
CommonsWare