使用 orderByChild() 时 addChildEventListener、addValueEventListener 和 addOnCompleteListener 之间的区别?
Difference between addChildEventListener, addValueEventListener, and addOnCompleteListener when using orderByChild()?
我正在尝试使用 orderByChild() 对来自 Firebase 的数据进行排序和显示,并使用了:
ref.child("dinosaurs").orderByChild("height").get().addOnCompleteListener(...);
我一直想知道为什么它不排序,直到我意识到文档中使用了 childEventListener
。应该是:
ref.child("dinosaurs").orderByChild("height").addChildEventListener(...);
在使用 orderByChild
或任何排序方法时,两者与 addValueEventListener
有什么区别? get()
不关注orderByChild()
吗?
您描述的所有方法return 子节点按照您的查询请求顺序排列。
很可能您是在 getValue()
上调用 DataSnapshot
的。这样做会将结果转换为 Map
并且(根据定义)映射中键的顺序未定义。
当您使用 addChildEventListener
时,您的 onChildAdded
已按顺序为每个单独的子快照调用,因此您无法犯此错误。
要按照您在 onDataChange
中请求的顺序处理结果子节点,并且在使用 get()
时,您需要循环遍历 DataSnapshot
的 getChildren()
返回,如 listening for value events 儿童列表中的文档所示。
所以像这样:
ref.child("dinosaurs").orderByChild("height").get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
@Override
public void onComplete(@NonNull Task<DataSnapshot> task) {
if (!task.isSuccessful()) {
Log.e("firebase", "Error getting data", task.getException());
}
else {
DataSnapshot snapshot = task.getResult();
for (DataSnapshot childSnapshot: snapshot.getChildren()) {
Log.i("FIREBASE", childSnapshot.getKey());
}
}
}
});
我正在尝试使用 orderByChild() 对来自 Firebase 的数据进行排序和显示,并使用了:
ref.child("dinosaurs").orderByChild("height").get().addOnCompleteListener(...);
我一直想知道为什么它不排序,直到我意识到文档中使用了 childEventListener
。应该是:
ref.child("dinosaurs").orderByChild("height").addChildEventListener(...);
在使用 orderByChild
或任何排序方法时,两者与 addValueEventListener
有什么区别? get()
不关注orderByChild()
吗?
您描述的所有方法return 子节点按照您的查询请求顺序排列。
很可能您是在 getValue()
上调用 DataSnapshot
的。这样做会将结果转换为 Map
并且(根据定义)映射中键的顺序未定义。
当您使用 addChildEventListener
时,您的 onChildAdded
已按顺序为每个单独的子快照调用,因此您无法犯此错误。
要按照您在 onDataChange
中请求的顺序处理结果子节点,并且在使用 get()
时,您需要循环遍历 DataSnapshot
的 getChildren()
返回,如 listening for value events 儿童列表中的文档所示。
所以像这样:
ref.child("dinosaurs").orderByChild("height").get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
@Override
public void onComplete(@NonNull Task<DataSnapshot> task) {
if (!task.isSuccessful()) {
Log.e("firebase", "Error getting data", task.getException());
}
else {
DataSnapshot snapshot = task.getResult();
for (DataSnapshot childSnapshot: snapshot.getChildren()) {
Log.i("FIREBASE", childSnapshot.getKey());
}
}
}
});