【问题标题】:Firebase childEventListener return value when path does not exist路径不存在时 Firebase childEventListener 返回值
【发布时间】:2017-02-01 22:08:15
【问题描述】:

阅读文档,当路径不存在时,似乎 childEventListener 不会触发。

这是一个问题,因为我想向用户显示没有数据的消息。

我可以添加一个类似in this answer 的 valueEventListener,但我将查询限制为最新值,即 query.limitToLast() 并且 valueEventListener 不限制Tolast,但会获取路径中的所有数据。

例如,我有:

posts
{
    $userid
    {
        $postid {
            post_content:content
            timestamp:1234567
        }
        $postid {
            post_content:content
            timestamp:1234567
        }
        $postid {
            post_content:content
            timestamp:1234567
        }
        $postid {
            post_content:content
            timestamp:1234567
        }
    }
}

我只对最新的帖子感兴趣,所以我会firebaseRef.child(users).child(userid).limitToLast(1).addChildEventListener,但用户可能还没有帖子,在这种情况下不会触发 childEventListener。

【问题讨论】:

  • 不确定限制值监听器的意思。如果您共享数据模型(作为 JSON 文本,没有屏幕截图)和您正在努力处理的代码,那么提供帮助会容易得多。

标签: android firebase firebase-realtime-database


【解决方案1】:

如果你想同时处理孩子和不存在孩子的情况,你可以同时添加一个值和一个孩子监听器:

Query query = firebaseRef.child(users).child(userid).limitToLast(1);
query.addChildEventListener(new ChildEventListener() {
    void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
        ...
    }
    ...
});
query.addValueEventListener(new ValueEventListener() {
    void onDataChange(DataSnapshot snapshot) {
        if (!snapshot.exists()) {
            // TODO: handle the "no data available" scenario
        }
    });
});

Firebase 客户端足够智能,即使在上述情况下有多个侦听器,也只能加载一次数据。


如果您愿意,您也可以使用单个 ValueEventListener 来完成此操作,如下所示:

query.addValueEventListener(new ValueEventListener() {
    void onDataChange(DataSnapshot snapshot) {
        if (!snapshot.exists()) {
            // TODO: handle the "no data available" scenario
        }
        else {
            for (DataSnapshot childSnapshot: snapshot.getChildren()) {
                // TODO: handle the child snapshot
            }
        }
    });
});

由于我们现在在snapshot 中获取所有匹配的子节点,因此我们循环snapshot.getChildren() 以获取与onChildAdded 中相同的数据。

【讨论】:

  • 是的,这与我发布的链接的答案相同。问题是它获取了节点中的所有数据。
  • 由于最初的查询(我会稍微修正一下代码)是limitToLast(1),所以两个监听器最初最多会得到一个回调。
  • 我不知道为什么,但我确信 ValueEventListener 会返回整个节点,而不会将其限制为最后一个......因此我很困惑。
【解决方案2】:

由于不可能将侦听器附加到不存在的路径,您可以尝试向您的用户添加一个属性来设置他拥有的帖子数量。向该属性添加一个侦听器,如果它发生变化,那么您确定用户确实在帖子中有路径引用,然后您可以向该节点添加一个侦听器并在每次使用 .childAdded 添加子项时获取查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多