2017-02-23 31 views
3

我遇到了一个奇怪的问题,其中使用orderByChild()的Firebase查询并未实际排序数据。下面是我想对数据进行排序的快照:(一共是关闭这个例子的目的)使用Firebase订购数据Android

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

无论哪种方式,尽管顺序应该如图所示,但我通过地图循环获取的数据不是按此顺序。

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

+0

是什么数据看起来像你回来为了防止这种情况,你应该使用DataSnapshot.getChildren()方法?你可否请更新你的原始文章,包括这个?谢谢 –

回答

7

当你执行一个查询你三样东西:

  • 他们键
  • 这些

之间的相对顺序当转换结果为Map它只能容纳其中的两个,所以订单丢失了。在操作列表

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(); 
    } 

另见火力地堡文档在这个例子:https://firebase.google.com/docs/database/android/lists-of-data#listen_for_value_events

1

看起来像你的数据结构严重不足。

Firebase具有键控的内部方式,Firebase只能订购这些键,并且需要额外的条件。但由于您的密钥是自定义密钥,因此Firebase不能也不会订购此分支。

的解决方法是调整你的数据以有意义的方式,这样

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

始终使用推()来生成新的密钥,创建列表自定义键,那是一个总没有去

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

,如果您想订购你的数据,你这是怎么做到这一点

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