Android Room with RxJava handle empty query result

Viewed 9823

Trying to test new Android Room librarty with RxJava adapter. And I want to handle result if my query returns 0 objects from DB:

So here is DAO method:

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

And how I handle it:

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) })

My DB is empty, so I expect .switchIfEmty() to work, but none of handling methods is firing. Neither .subscribe() nor .switchIfEmpty()

4 Answers

You could use some wrapper for result. For example:

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");
                }
            });
}

And use it like 'Single' in this case you will get result in any case. Use:

dbStorage.getTransaction(selectedCoin.getId())
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(r -> {
                         if(!r.isEmpty()){
                           // we have some data from DB
                         } else {
                       }
                    })
Related