【发布时间】:2017-11-12 14:56:08
【问题描述】:
首先,我知道这个问题已被多次问过,但最近我的应用程序出现的问题激起了我对这个问题的兴趣。我也阅读了 Firebase 文档。
What is the difference between ChildEventListener and ValueEventListener Firebase interfaces?
从上面的话题来看,似乎 Child 和 Event 监听器具有相同的功能但具有不同的“灵活性”,我认为这是正确的。
就上下文而言,我将提供我最近项目中的两个示例。
示例 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 中的查询方法获取最后一个节点的值。这是代码的sn-p。
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"
}
}
}
这是我获取用户数据的sn-p代码。
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() 返回空值。然后,这就是我突然想要一个解释,以便继续前进,我可以更好地理解这两个听众的工作方式并做出相应的选择。
这些是我的具体问题:
- 如果涉及查询,是 ChildEventListener 是我选择的而不是替代方案吗?
- 从上面的两个示例中,当我可以指定具有 Key:Value 对的节点时,似乎使用了 ValueEventListener 紧邻指定节点的下一级。另一方面,ChildEventListener 在不涉及 Value 时使用,只是 Childs(这就是 ChildEventListener 中的“Child”的含义?)。我这样说是否正确?
感谢您阅读本部分,如果这个问题太长,我深表歉意。
【问题讨论】:
标签: java android firebase firebase-realtime-database