我已将此查询返回到Firebase数据库,该数据库返回一个 bool(boolean) 值以指示存在子值。我正在使用Rx2Firebase's包装器来简化查询:
override fun isFavorite(beerId: String): Observable<Boolean> {
var task = path.child(beerId)
return RxFirebaseDatabase.observeSingleValueEvent(task) { t -> map(t) }.toObservable()
}
private fun map(t: DataSnapshot): Boolean {
return (t.value ?: false) as Boolean
}
如果查询返回null,则应通过“map”方法将其转换为false。否则,应根据子值返回true或false。问题是,当没有子映射方法时,不会被调用。
研究
observeSingleValueEvent
的实现,有一个过滤器可以防止map被调用:@NonNull
public static <T> Maybe<T> observeSingleValueEvent(@NonNull Query query, @NonNull Function<? super DataSnapshot, ? extends T> mapper) {
return observeSingleValueEvent(query).filter(DataSnapshotMapper.DATA_SNAPSHOT_EXISTENCE_PREDICATE).map(mapper);
}
static final Predicate<DataSnapshot> DATA_SNAPSHOT_EXISTENCE_PREDICATE = new Predicate<DataSnapshot>() {
public boolean test(@NonNull DataSnapshot dataSnapshot) throws Exception {
return dataSnapshot.exists();
}
};
我该如何解决这个问题?
最佳答案
您应该使用observeSingleValueEvent(query)
方法,而不要使用包含映射子句的方法。如果dataSnapshot
不存在,则 map 将始终导致异常,这就是在此使用过滤器的原因。
为了避免这种情况,您应该只使用库的默认observeSingleValueEvent
方法。
override fun isFavorite(beerId: String): Observable<Boolean> {
var task = path.child(beerId)
return RxFirebaseDatabase.observeSingleValueEvent(task).map{ it.exists }.toObservable()
}