使用 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() 时,您需要循环遍历 DataSnapshotgetChildren()返回,如 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());
            }
        }
    }
});