我已将此查询返回到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()
    }

10-07 12:40
查看更多