我在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默认顺序。我的问题是如何按结构顺序返回?
答案 0 :(得分:0)
这里有两个解决方案。一种解决方案是使用ordering method查询数据库,这将是orderByChild(time_created)
方法。第二种方法是将关键节点从chat-01
,chat-02
等更改为由push()
方法生成的唯一键。此推送ID基于时间并完全在客户端上生成,无需咨询服务器。这是Firebase中的常见做法。