新しいAndroid RxJavaアダプターを使用したルームライブラリーをテストしようとしています。クエリがDBから0個のオブジェクトを返した場合の結果を処理したいのですが:
これがDAOメソッドです。
@Query("SELECT * FROM auth_info")
fun getAuthInfo(): Flowable<AuthResponse>
そして私がそれをどのように扱うか:
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) })
私のDBは空なので、.switchIfEmty()が機能することを期待していますが、処理メソッドはどれも起動していません。 .subscribe()も.switchIfEmpty()もありません
Db Flowablesは監視可能であるため(データベースが変更されてもディスパッチを継続します)、完了しません。 List<AuthResponse>
を返してみてください。オプションのバックポーティングを検討しましたが、少なくとも今のところはそうしないことにしました。代わりに、さまざまな既知のライブラリでオプションのサポートを追加する可能性があります。
バージョン1.0.0-alpha5では、ルームはDAOにMaybe
とSingle
のサポートを追加したため、次のように記述できます。
@Query("SELECT * FROM auth_info")
fun getAuthInfo(): Maybe<AuthResponse>
あなたはそれについてもっと読むことができます ここ
結果にラッパーを使用できます。例えば:
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");
}
});
}
そして、この場合は「シングル」のように使用すると、どのような場合でも結果が得られます。使用する:
dbStorage.getTransaction(selectedCoin.getId())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(r -> {
if(!r.isEmpty()){
// we have some data from DB
} else {
}
})
switchIfEmpty
はパラメータとして_Publisher<AuthResponse>
_を取ります。 SAM変換により、指定された無名関数がこのクラスに変換されます。ただし、Publisher
から期待される動作には従わないため、期待どおりに機能しません。
Flowable.empty().doOnSubscribe { Log.d(TAG, "IS EMPTY") }
のような正しい実装に置き換えれば、機能するはずです。