带有RxJava的Android Room处理空查询结果

时间:2017-05-27 10:00:54

标签: android kotlin rx-java2 android-room

尝试使用RxJava适配器测试新的Android Room librarty。如果我的查询从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) })

我的数据库是空的,所以我希望.switchIfEmty()可以正常工作,但是处理方法都没有被触发。既没有.subscribe()也没有.switchIfEmpty()

4 个答案:

答案 0 :(得分:8)

Db Flowables是可观察的(因此,如果数据库发生变化,它们会继续调度),因此它永远不会完成。您可以尝试返回List<AuthResponse>。我们已经考虑过重新移植一个可选项,但决定不这样做,至少目前是这样。相反,我们可能会在不同的已知库中添加对Optional的支持。

答案 1 :(得分:6)

在版本1.0.0-alpha5中,会议室为DAO添加了对MaybeSingle的支持,所以现在你可以编写类似

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

您可以阅读更多相关信息here

答案 2 :(得分:0)

func webViewDidStartLoad(_ webView : UIWebView) { activityIndicator.startAnimating() } func webViewDidFinishLoad(_ webView : UIWebView) { activityIndicator.stopAnimating() } switchIfEmpty作为参数。通过SAM转换,您的给定匿名函数将转换为此类。但是,它不遵循Publisher<AuthResponse>所期望的行为,因此无法按预期工作。

将其替换为Publisher这样的正确实现,它应该可以正常工作。

答案 3 :(得分:0)

您可以使用一些包装器来获得结果。例如:

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

并使用它像单身&#39;在这种情况下,无论如何你都会得到结果。使用:

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