gpt4 book ai didi

java - Firebase child 和值(value)听众

转载 作者:太空宇宙 更新时间:2023-11-03 13:43:17 26 4
gpt4 key购买 nike

首先,我知道这个问题已经被问过多次,但我的应用程序最近出现的问题激起了我对这个问题的兴趣。我也阅读了 Firebase 文档。

What is the difference between ChildEventListener and ValueEventListener Firebase interfaces?

从上面的话题来看,Child和Event监听器似乎功能相同,但“灵 active ”不同,我认为是这样。

仅供引用,我将提供我最近项目中的两个示例。

示例 1:

数据库结构

{
"requests" : {
"pushed_id_1" : {
"request_name" : "qjvnocnqjd",
"request_date" : "11 Oct 2017"
},
"pushed_id_2" : {
"request_name" : "qjvnocnqjd",
"request_date" : "10 Nov 2017"
}
}
}

引用上面的结构,我最初的计划是使用Firebase中的查询方法获取最后一个节点的值。这是代码 fragment 。

myRef.child("requests").orderByKey().limitToLast(1).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Request request = dataSnapshot.getValue(Request.class);
Log.d(TAG, "requestDate: " + request.getRequest_date());
}

上面的代码为 request.getRequest_date() 提供了一个空值。经过几次痛苦的解决方案搜索后,我找到了下面的帖子。

Retrieve null values from Firebase database Android

上面链接的 TL;DR 是解决方案是将 ValueEventListener 更改为 ChildListener,它在我的项目中产生了奇迹。然后是我的第二个例子。

示例 2:

数据库结构

{
"users" : {
"user_uid_1" : {
"user_name" : "Admin",
"join_date" : "7 Nov 2017"
},
"user_uid_2" : {
"user_name" : "Member",
"join_date" : "9 Nov 2017"
}
}
}

这是我获取用户数据的代码 fragment 。

myRef.child("users").child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {

User user = dataSnapshot.getValue(User.class);
Log.d(TAG, "userDeets: " + user.getJoin_date());

}
}

上面的代码没有为 user.getJoin_date() 返回 null。然后,这就是我突然想要一个解释的时候,以便继续前进,我可以更好地理解这两个听众的工作方式并做出相应的选择。

这些是我的具体问题:

  • 如果涉及到查询,ChildEventListener 是我选择的而不是备选的吗?
  • 从上面的两个示例来看,当我可以指定具有紧挨着指定节点下一级的 Key:Value 对的节点时,似乎使用了 ValueEventListener。另一方面,当不涉及值时使用 ChildEventListener,仅涉及 Childs(这就是 ChildEventListener 中的“Child”的含义?)。我之前的说法对吗?

感谢您阅读到这一部分,如果这个问题太长,我深表歉意。

最佳答案

要简单得多:ValueEventListener 一次性触发整个结果,ChildEventListener 分别触发结果的每个子节点 .

要确定您是否需要 ValueEventListenerChildEventListener,需要考虑两件事:

  1. 您的引用是指向单个项目还是列表。
  2. (在列表的情况下)您是要单独处理每个项目,还是要一次处理所有项目。

如果您有一个指向单个项目的监听器,您将使用 ValueEventListener

如果您有一个指向列表的监听器或查询,无论是否只有一个子项/结果,您都需要处理该列表。您可以通过使用 ChildEventListener 或在 ValueEventListener.onDataChange() 中循环 DataSnapshot.getChildren() 来实现。

关于java - Firebase child 和值(value)听众,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47250212/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com