我遇到有关Room和RxJava Single的空数据库返回的问题。 我知道我的数据库是空的,所以我希望在触发时会得到空的回报
@Query("SELECT * FROM Times WHERE timestamp = :timestamp")
fun getTimes(timestamp: String): Single<Times>
问题是当我按如下方式调用此函数
timeDao.getTimes("1398332113")
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.doOnError { Log.e("Single", "Returned null") }
.doOnSuccess { result -> times = result}
.subscribe()
订户确实在调用doOnError
方法,例如
E / Single:返回null
但仍然返回异常并崩溃
W / System.err:io.reactivex.exceptions.OnErrorNotImplementedException: 查询返回空结果集:SELECT * FROM Times WHERE timestamp = ?
我在StackOverflow上看到了很多类似的问题,但是找不到答案。我在做什么错了?
答案 0 :(得分:1)
首先解决您的问题。由于public interface Observer {
public void notifyUpdate(Contact contact);
}
public interface Observable {
public void addObserver(Observer observer);
}
public class Detail extends JFrame implements Observable {
/* multiple observers possible */
private ArrayList<Observer> observers;
/* contact will be modified in detail-view and reported to overview-view */
private Contact contact;
public Detail() {
this.observers = new ArrayList<>();
}
@Override
public void addObserver(Observer observer) {
this.observers.add(observer);
}
/* trigger this methode e.g. by save-button, after modifiing contact */
protected void notifyObservers() {
/* multiple observers possible */
Iterator<Observer> observerIterator = this.observers.iterator();
while(observerIterator.hasNext()) {
/* report observer: constact has modified */
observerIterator.next().notifyUpdate(contact);
}
}
}
public class Contacts extends JFrame implements Observer {
private Detail detail;
public Contacts() {
detail = new Detail();
detail.setVisible(true);
detail.addObserver(this);
}
@Override
public void notifyUpdate(Contact contact) {
/* notifyUpdate was called from Observable */
/* process contact, DB update, update JTable */
}
}
版本的Room支持2.1.0-alpha01
返回类型,因此非常适合对问题进行建模。
Maybe可以使用以下顺序协议进行操作:Maybe
当您的项目在数据库中时:onSubscribe (onSuccess | onError | onComplete)?
将与数据一起调用。如果数据库为空,onSuccess
将被调用。 onComplete
不言自明。
在Dao类中将onError
替换为Single
即可。
更多说明:
Maybe
timeDao.getTimes("1398332113")
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.doOnError { Log.e("Single", "Returned null") }
.doOnSuccess { result -> times = result}
.subscribe()
将在出现en错误的情况下执行lambda,但仍会沿链向下发出错误。您的程序由于不处理错误而崩溃(doOnError
为空)。
您可以执行subscribe()
来防止崩溃。
如果目标是在数据库为空的情况下返回一些默认值,则您将要使用subscribe({/* doing nothing for success */}, {e -> Log.e("TAG", "Empty DB")})
以便链继续进行。看看this blog post了解更多信息。
默认值不能为null,Reactive Streams规范(RxJava2实现)不支持null值。