【问题标题】:Ordering of data with Firebase Android使用 Firebase Android 对数据进行排序
【发布时间】:2019-07-23 14:57:48
【问题描述】:

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

这是我目前使用的代码:

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 位整数,则按字典顺序对键进行排序。

尽管顺序应该如图所示,但是我在循环地图时返回的数据不是这个顺序。

如果有人能指出我正确的方向,我将不胜感激。谢谢!

【问题讨论】:

  • 您返回的数据是什么样的?您能否更新您的原始帖子以包含此内容?谢谢

标签: android firebase firebase-realtime-database


【解决方案1】:

当你执行一个查询时,你会得到三样东西:

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

当您将结果转换为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();
    }

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

【讨论】:

    【解决方案2】:

    看起来您的数据结构不正确。

    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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多