使用Firebase Android订购数据

Ron*_*on7 3 android firebase firebase-realtime-database

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

数据快照

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

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) {

        }
    });
Run Code Online (Sandbox Code Playgroud)

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

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

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

Fra*_*len 9

执行查询时,您会得到三件事:

  • 他们的钥匙
  • 价值
  • 这些之间的相对顺序

当您将结果转换为a时,Map它只能容纳其中的两个,因此订单将丢失.为防止这种情况,您应该使用以下DataSnapshot.getChildren()方法:

Query query = locationComment.orderByKey();
query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.getValue() == null) {
            return;
        }
        data.clear();
        for (DataSnapshot child : dataSnapshot.getChildren()) {
            ...
        }
        adapter.notifyDataSetChanged();
    }
Run Code Online (Sandbox Code Playgroud)

另请参阅Firebase文档中有关使用列表的示例:https://firebase.google.com/docs/database/android/lists-of-data#listen_for_value_events