Firebase valueEventListener不会按顺序返回

时间:2017-12-13 03:31:57

标签: android firebase firebase-realtime-database

我在firebase上创建了一个具有以下结构的聊天应用程序:

Project
.
....Chats
.  .
.  ....chat-01
.  .  .
.  .  ....author : "john@example.com"
.  .  .
.  .  ....content : "hi"
.  .  .
.  .  ....time_created : "12-12-2017 22:30:00"
.  .
.  ....chat-02
.  .  .
.  .  ....author : "alice@example.com"
.  .  .
.  .  ....content : "hello, how are you ?"
.  .  .
.  .  ....time_created : "12-12-2017 22:31:00"
.  .
.  ....chat-03
.     .
.     ....author : "john@example.com"
.     .
.     ....content : "hi"
.     .
.     ....time_created : "12-12-2017 22:32:00"
.
....chatgroups
   .
   ....chatgroup-1
      .
      ....chats
         .
         ....chat-01 : 1
         .
         ....chat-02 : 1
         .
         ....chat-03 : 1

我检索聊天的方式是:

public void getChatrooms(){
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
    ref.child("chatgroups").child("chatgroup-1").child("chats").addListenerForSingleValueEvent(new ValueEventListener(){

    @Override
    public void onDataChange(final DataSnapshot dataSnapshot){
        Iterator iterator = dataSnapshot.getChildren().iterator();
        while(iterator.hasNext()){
            DataSnapshot dataSnapshot = (DataSnapshot)iterator.next();
            getChatDetails(dataSnapshot.getKey());
        }
    }
    });
}

public void getChatDetails(String key){
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
    ref.child("chats").child(key).addListenerForSingleValueEvent(new ValueEventListener(){

        @Override
        public void onDataChange(final DataSnapshot dataSnapshot){
            System.out.println(dataSnapshot.child("content").getValue().toString())
        }
        });
}

问题是这段代码按以下顺序返回聊天: chat-01,chat-03,chat-02。它有聊天作者订购的行为。因为当我将 chat-01 作者更改为&#34; alice@example.com"时,它会按以下顺序返回: chat-01,chat-02,chat-03 < / strong>,但如果我将 chat-04 添加到&#34; alice@example.com"作为聊天和聊天组的作者,它将返回: chat-01,chat-02,chat-04,chat-03。我不知道问题是否是由异步引起的回调或firebase默认顺序。我的问题是如何按结构顺序返回?

1 个答案:

答案 0 :(得分:0)

这里有两个解决方案。一种解决方案是使用ordering method查询数据库,这将是orderByChild(time_created)方法。第二种方法是将关键节点从chat-01chat-02等更改为由push()方法生成的唯一键。此推送ID基于时间并完全在客户端上生成,无需咨询服务器。这是Firebase中的常见做法。