我有一些数据存储在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());
}
}
}
答案 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
。