【问题标题】:Firebase doesn't return ordered resultFirebase 不返回有序结果
【发布时间】:2016-09-12 07:33:59
【问题描述】:

我想从 Firebase 中获取按“sortDate”排序的结果,但实际的结果是随机排序的。我想按以下顺序获取数据:[臀部、胸部、背部、腰部]。这是我的代码:

final DatabaseReference myRef = FirebaseDatabase.getInstance().getReference().child("parts");

        final DatabaseReference user = myRef.child("slavi");
        user.orderByChild("sortDate");

        user.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                if (dataSnapshot.exists()) {

我还添加了 firebase 结构的图像。

【问题讨论】:

  • 我认为这里的错误是您将时间戳作为字符串添加到数据中。尝试使用一个数字,它应该可以工作。
  • Ishank Gulati,感谢您的建议,但即使将 sortDate 更改为 long 类型,它仍然是一样的
  • 更新后能再发一张控制台截图吗?
  • 看起来不错。它仍然无法正常工作,尝试用 Query 替换 DatabaseReference,但我不确定这是否可行。
  • 只是想弄清楚你的问题。您希望对从 firebase 返回的数据进行排序,还是对存储在 firebase 中的数据进行排序?

标签: android firebase firebase-realtime-database


【解决方案1】:

您可以将dataSnapshot.getChildren()ValueEventListener 一起使用。它将按顺序循环遍历子快照。它与具有更详细文档的 JS SDK DataSnapshot.forEach 具有相似的语义。

for (DataSnapshot child : dataSnapshot.getChildren()) {
    Log.i(TAG, "test " + child.getValue());
}

或者您可以使用ChildEventListener,它按顺序调用onChildAdded,每个子快照都按顺序调用

    user.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    Log.i(TAG, "test2 " + dataSnapshot.getValue());
                }

                ...

更新:

我看到了你的问题。您没有将侦听器附加到查询引用。

user.orderByChild("sortDate");

user.addListenerForSingleValueEvent(new ValueEventListener() {

应该是:

   user.orderByChild("sortDate").addListenerForSingleValueEvent(new ValueEventListener() {

【讨论】:

  • 我完全使用 dataSnapshot.getChildren() 并且它们不按顺序
  • 不,我正在附加一个侦听器,但分两步完成:user.orderBy...、user.addListener。结果完全一样。
  • 我什至可以这样做: FirebaseDatabase.getInstance().getReference() .child("parts") .child("slavi").orderByChild("sortDate") .addListenerForSingleValueEvent(new ValueEventListener() { 但我通过分隔不同的部分使其更加清晰。
【解决方案2】:

当您调用 Firebase 的任何查询方法(orderBy...startAt()equalAt() 等)时,您会返回一个新的 Query 对象。您的代码没有保留对该查询对象的引用。

解决这个问题:

 final DatabaseReference user = myRef.child("slavi");
 Query query = user.orderByChild("sortDate");

 query.addListenerForSingleValueEvent(new ValueEventListener() {
      public void onDataChange(DataSnapshot dataSnapshot) {
          for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
              System.out.println(userSnapshot.getKey());
          }

【讨论】:

    猜你喜欢
    • 2017-10-18
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2015-10-23
    • 2012-06-08
    • 2021-01-02
    相关资源
    最近更新 更多