使用Firebase Android

时间:2017-02-23 23:57:02

标签: android firebase firebase-realtime-database

我遇到了一个奇怪的问题,其中使用orderByChild()的Firebase查询实际上并没有对数据进行排序。下面是我正在尝试订购的数据的快照:(为了这个例子,总数是关闭的)

Snapshot of data

这是我到目前为止使用的代码:

Query query = locationComment.orderByKey();
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.getValue() == null) {
                return;
            }
            data.clear();
            adapter.notifyDataSetChanged();
            String userId;
            String time;
            String comment;
            Map<String, String> commentMap = (Map) dataSnapshot.getValue();
            for (Map.Entry<String, String> entry : commentMap.entrySet()) {
                if(!((entry.getKey()).contains("total"))) {
                    String[] keyString = (entry.getKey()).split(",");
                    time = keyString[0];
                    userId = keyString[1];
                    comment = entry.getValue();
                    Date resultdate = new Date(Integer.parseInt(time));
                    data.add(new Comment(comment,
                            DateFormat.getDateTimeInstance().format(resultdate), userId));
                    adapter.notifyItemInserted(data.size());
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

我得到了每一个键值对(除了总数),除了它没有按预期排序(按键排序)。 Firebase文档说,如果密钥无法解析为32位整数,则按字典顺序排序。

无论哪种方式,顺序应该如图所示,但我循环通过地图时返回的数据不按此顺序。

如果有人能指出我正确的方向,我真的很感激。谢谢!

1 个答案:

答案 0 :(得分:1)

您的数据看起来结构糟糕。

Firebase具有内部键控方式,Firebase只能根据需要订购这些密钥。但由于你的密钥是自定义密钥,firebase不能也不会命令这个分支。

解决方案是以有意义的方式重构您的数据,例如

+ comments
  + total: 13
  + data: 
     + 12uoasjihdou3
        + time: xx
        + userID: xx
        + comment: xx
     + 123tjiueoi134
     + 1piahf9hasheui
     + 6890324890oiuwer

始终使用push()生成新密钥,为列表创建自定义密钥,即不去

FirebaseDatabase.getReference("comments").child("data").push({yourdata});

如果您想订购数据,这就是您的工作方式

FirebaseDatabase.getReference("comments").child("data").orderByChild("time");