いい記事があったので。
Room 🔗 RxJava – Google Developers – Medium
まずは、Room で Dao.
@Query(“SELECT * FROM Users WHERE id = :userId”)
User getUserById(String userId);
ここまでで問題なのは、
1. 同期呼び出しでブロッキング。
2. データ変更時に再度呼び出す必要がある。
ということで、RxJava を使いたくなります。
Room は RxJava2.x に対応しています。
Adding Components to your Project | Android Developers
どのように使うのか?
Maybe
@Query(“SELECT * FROM Users WHERE id = :userId”)
Maybe<User> getUserById(String userId);
1. 該当ユーザがなければ、何も返さずに complete。
2. 該当ユーザがあれば、onSuccess となり complete。
3. Maybe が complete されたあとにユーザー情報が更新されても何もしない。
Single
@Query(“SELECT * FROM Users WHERE id = :userId”)
Single<User> getUserById(String userId);
1. 該当ユーザがなければ、何も返さず onError(EmptyResultException)。
2. 該当ユーザがあれば、onSuccess。
3. Single が complete されたあとにユーザー情報が更新されても何もしない。
Flowable
@Query(“SELECT * FROM Users WHERE id = :userId”)
Flowable<User> getUserById(String userId);
1. 該当ユーザはなければ、何も返さず emit もされない。当然、onNext も onError も呼ばれない。
2. ユーザが存在すれば、onNext。
3. ユーザ情報が更新されるたびに、自動で emit されるので、UI上を最新データに更新させることが可能になる。
まとめ
これだけ数行でデータベース、非同期処理を簡潔明快に説明できる Room x RxJava の組み合わせ。
おまけに Observable から細分化された RxJava2.x の主役たちの使い方も理解することができます。
素晴らしいですよね。