使用orderByKey,Firebase不会按预期返回升序

时间:2017-10-16 08:26:40

标签: java android sorting firebase firebase-realtime-database

我有一些数据存储在Firebase上,使用时间戳作为其键值, 但我不能按照预期的那样用 orderByKey 对它们进行排序:返回值不按升序返回。

我的JSON结构如下:

{
  "1476986154" : {
    "Cons" : {
      "Black" : 91.531099,
      "Cancel" : 98.832554,
      "Happy" : 97.104925,
      "Pair" : 95.515542
    },
    "Fairy" : {
      "Apple" : {
        "Chair" : {
          "Area" : 1,
          "Count" : 96,
          "Teen" : 0.162139,
          "Score" : 95.16093
        },
        "Fake" : {
          "Area" : 3,
          "Count" : 98,
          "Teen" : 0.683259,
          "Score" : 98.249105
        }
      },
      "Dark" : {
        "Lake" : {
          "Read" : {
            "Height" : 0,
            "Width" : 0,
            "X" : 0,
            "Y" : 0
          }
        },
        "Red" : {
          "Read" : {
            "Height" : 0,
            "Width" : 0,
            "X" : 0,
            "Y" : 0
          }
        }
      }
    },
    "PhotoName" : "oo",
    "Versions" : {
      "Library" : "5.5.6.6"
    }
  },
  "1477280739" : {
    "Cons" : {
      "Black" : 96.389055,
      "Cancel" : 98.265668,
      "Happy" : 93.661556,
      "Pair" : 91.361142
    },
    "Fairy" : {
      "Apple" : {
        "Chair" : {
          "Area" : 1,
          "Count" : 100,
          "Teen" : 0.171286,
          "Score" : 90.849593
        },
        "Fake" : {
          "Area" : 3,
          "Count" : 99,
          "Teen" : 0.200965,
          "Score" : 92.367154
        }
      },
      "Dark" : {
        "Lake" : {
          "Read" : {
            "Height" : 0,
            "Width" : 0,
            "X" : 0,
            "Y" : 0
          }
        },
        "Red" : {
          "Read" : {
            "Height" : 0,
            "Width" : 0,
            "X" : 0,
            "Y" : 0
          }
        }
      },
    },
    "Name" : "pp",
    "Versions" : {
      "Library" : "5.5.6.6"
    }
  }
}

它首先返回最大值(1490034200),然后从最小值返回到第二大值(从1476510510到1488805137)。 这让我很困惑,因为我需要知道回调现在是不是最后一次。

代码在这里:我只是在查询具有相同ValueEventListener的所有数据之前查询最后的数据:

DatabaseReference.orderByKey().limitToLast(recordQty).addValueEventListener(valueEventListener);
//...
DatabaseReference.orderByKey().addValueEventListener(valueEventListener);

任何人都可以理解为什么这种尝试不起作用?

以下是我的听众的样子:

private class ValueEventOnChangeListener implements ValueEventListener {


        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (mDataArrayList == null) {
                mDataArrayList = new ArrayList<>();
            } else {
                mDataArrayList.clear();
            }

            getDataChange(dataSnapshot);

            if (mListener != null) {
                mListener.success(mDataArrayList);
            }
        }

        private void getDataChange(DataSnapshot dataSnapshot){
            try {
                if (mSubDataType == null){
                    for (DataSnapshot data : dataSnapshot.getChildren()){
                        long timestamp = Long.parseLong(data.getKey());
                        mDataArrayList.add(timestamp);
                    }
                }
            }
            catch (Exception e){
                Log.e(TAG, "onDataChange Exception: " + e.toString());
            }
        }
}

1 个答案:

答案 0 :(得分:0)

我无法重现这个问题。

如果我运行这段代码:

myRef.orderByKey().addValueEventListener(new ValueEventListener() {


    public ArrayList<Long> mDataArrayList;

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (mDataArrayList == null) {
            mDataArrayList = new ArrayList<>();
        } else {
            mDataArrayList.clear();
        }

        getDataChange(dataSnapshot);

        System.out.println(mDataArrayList);

    }


    private void getDataChange(DataSnapshot dataSnapshot){
        try {
            for (DataSnapshot data : dataSnapshot.getChildren()){
                long timestamp = Long.parseLong(data.getKey());
                mDataArrayList.add(timestamp);
            }
        }
        catch (Exception e){
            System.err.println("onDataChange Exception: " + e.toString());
        }
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
});

使用此JSON:

{ "1476986154" : true, "1477280739" : true }

打印:

[1476986154, 1477280739]

1476986154&lt; 1477280739以来,这对我来说是正确的顺序DISTINCT

相关问题