尝试使用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()
答案 0 :(得分:8)
Db Flowables是可观察的(因此,如果数据库发生变化,它们会继续调度),因此它永远不会完成。您可以尝试返回List<AuthResponse>
。我们已经考虑过重新移植一个可选项,但决定不这样做,至少目前是这样。相反,我们可能会在不同的已知库中添加对Optional的支持。
答案 1 :(得分:6)
在版本1.0.0-alpha5中,会议室为DAO添加了对Maybe
和Single
的支持,所以现在你可以编写类似
@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 {
}
})