【问题标题】:Difference between addChildEventListener, addValueEventListener, and addOnCompleteListener when using orderByChild()?使用 orderByChild() 时 addChildEventListener、addValueEventListener 和 addOnCompleteListener 的区别?
【发布时间】:2021-12-26 01:13:26
【问题描述】:

我正在尝试使用 orderByChild() 对来自 Firebase 的数据进行排序和显示并使用:

ref.child("dinosaurs").orderByChild("height").get().addOnCompleteListener(...);

我一直想知道为什么它没有排序,直到我意识到文档中使用了childEventListener。应该是:

ref.child("dinosaurs").orderByChild("height").addChildEventListener(...);

在使用orderByChild或任何排序方法时,两者和addValueEventListener有什么区别? get()不关注orderByChild()吗?

【问题讨论】:

  • 在下面回答????。在以后的问题中,请确保您对问题的完整重现最少,因为这里的问题来自您如何处理结果,而不是您如何查询结果。
  • 谢谢@FrankvanPuffelen。我忽略了那部分。

标签: java android sorting firebase-realtime-database


【解决方案1】:

您描述的所有方法都按您的查询请求的顺序返回子节点。

您很可能会在完整的DataSnapshot 上调用getValue()。这样做会将结果转换为 Map 并且(根据定义)映射中键的顺序是未定义的。

当您使用addChildEventListener 时,您的onChildAdded 已按顺序为每个单独的子快照调用,因此您无法犯此错误。

要按照您在onDataChange 中请求的顺序处理生成的子节点,并且在使用get() 时,您需要循环返回DataSnapshot 中的getChildren(),如@ 上的文档所示987654321@ 在孩子名单上。

比如:

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());
            }
        }
    }
});

【讨论】:

  • 感谢您的澄清。我还使用了与您的示例相同的循环,并且从未使用过 getValue。事实证明,我正在使用字符串值而不是影响排序的整数来更新数据。另一个问题是,在一个活动中更新数据并从另一个活动访问该数据后,显示的是旧数据,这很奇怪'因为我可以看到我的数据库正在更新,但 get() 似乎获取缓存的数据.这可能在一个新问题中得到更好的解决。
  • Nvm。我没有同步我的数据,这就是显示旧数据的原因。非常感谢。
猜你喜欢
  • 2017-05-25
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多