消息时间戳中按日期排序在Firebase

时间:2017-03-09 04:07:56

标签: android firebase firebase-realtime-database

使用的查询:

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

1 个答案:

答案 0 :(得分:1)

当您对Firebase数据库执行查询时,它会为每个匹配的节点返回三条信息:

  1. 该节点的值
  2. 该节点的密钥
  3. 该节点相对于结果中其他节点的顺序
  4. 当您打印快照时,您实际上正在打印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);
        }
    }