使用的查询:
q = FirebaseDatabase.getInstance().getReference().child("products").orderByChild("timestamp");
q.addValueEventListener(new ValueEventListener() {
@Override
public void onCancelled(DatabaseError databaseError) {
}
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d("datasnapshot", dataSnapshot.toString());
此值在我的Firebase数据库中的顺序相同。
注意:我使用负值方法{ -1 * new Date().getTime();}
来存储时间戳。
此值在我的Firebase数据库中的顺序相同:
Ke7K4vXyEt4gKnjf68H
时间戳:-1488345920790
Ke7KB2F1UKh8LoWcCY3
时间戳:-1488345945825
KeHlQIBnOE3diP8Wksh
时间戳:-1488521122407
KeI9nJtt4eg5Vd0rcAv
时间戳:-1488527774123
KeWwWW_ezG-cjmF8TNO
时间戳:-1488775680799
KeX7G0WOVidrMBbuGiT
时间戳:-1488778758960
Keg3mtNpyKStpVMMvRm
时间戳:-1488945623757
Keg4fN3rAN7uy5weFJz
时间戳:-1488945855094
以下顺序是我打印数据快照时得到的:
KeX7G0WOVidrMBbuGiT
时间戳:-1488778758960
Keg3mtNpyKStpVMMvRm
时间戳:-1488945623757
Keg4fN3rAN7uy5weFJz
时间戳:-1488945855094
Ke7K4vXyEt4gKnjf68H
时间戳:-1488345920790
KeWwWW_ezG-cjmF8TNO
时间戳:-1488775680799
KeHlQIBnOE3diP8Wksh
时间戳:-1488521122407
Ke7KB2F1UKh8LoWcCY3
时间戳:-1488345945825
KeI9nJtt4eg5Vd0rcAv
时间戳:-1488527774123
答案 0 :(得分:1)
当您对Firebase数据库执行查询时,它会为每个匹配的节点返回三条信息:
当您打印快照时,您实际上正在打印Map<String, Object>
查询结果。在地图中,只有两个信息的空间:每个节点的密钥和该节点的值。因此,打印结果时,节点的顺序会丢失。
因此,您应该使用快照的内置getChildren()
方法迭代结果的子项:
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child: dataSnapshot.getChildren()) {
Log.d("datasnapshot", child.getKey()+": "+child.getValue());
}
}
通过这个,你会看到孩子们的时间戳顺序。
如果您想将它们保留在列表中(以便维护订单),我建议您只保留快照列表:
public void onDataChange(DataSnapshot dataSnapshot) {
List<DataSnapshot> list = new LinkedList<DataSnapshot>();
for (DataSnapshot child: dataSnapshot.getChildren()) {
Log.d("datasnapshot", child.getKey()+": "+child.getValue());
list.add(child);
}
}