web-dev-qa-db-ja.com

Android RxJavaのある部屋は空のクエリ結果を処理します

新しい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()もありません

9
Nikita Unkovsky

Db Flowablesは監視可能であるため(データベースが変更されてもディスパッチを継続します)、完了しません。 List<AuthResponse>を返してみてください。オプションのバックポーティングを検討しましたが、少なくとも今のところはそうしないことにしました。代わりに、さまざまな既知のライブラリでオプションのサポートを追加する可能性があります。

9
yigit

バージョン1.0.0-alpha5では、ルームはDAOにMaybeSingleのサポートを追加したため、次のように記述できます。

@Query("SELECT * FROM auth_info")
fun getAuthInfo(): Maybe<AuthResponse>

あなたはそれについてもっと読むことができます ここ

6
J-rooft

結果にラッパーを使用できます。例えば:

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 {
                       }
                    })
0
Djek-Grif

switchIfEmptyはパラメータとして_Publisher<AuthResponse>_を取ります。 SAM変換により、指定された無名関数がこのクラスに変換されます。ただし、Publisherから期待される動作には従わないため、期待どおりに機能しません。

Flowable.empty().doOnSubscribe { Log.d(TAG, "IS EMPTY") }のような正しい実装に置き換えれば、機能するはずです。

0
Kiskae