我正在开发一个有许多聊天室的聊天应用程序,当有人回复聊天室时,他会自动订阅它。
我的Firebase数据库结构是:
chats
--chatID
----chatName
----user
unreadMessages
--chatID
----messageID
------userID
我尝试尽可能多地为您编写代码,以便更容易阅读。
现在,在我的MainActivity上,我查询了所有的聊天室,我也希望得到未读的消息号。这需要多个嵌套查询,问题是它们都在不同的时间发生,因此我无法知道内部循环何时结束以及Firebase查询何时结束。
这意味着在最后一行,由于时间的原因,它会为聊天室添加0条未读消息。
希望你能在这里帮助我,我几乎尝试过任何事情,而且数小时令人沮丧并没有帮助。
DatabaseReference chatsRef = database.getReference("chats");
chatsRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
final String chatRoomID = dataSnapshot.getKey(); //get chatID
//handle unread messages
DatabaseReference unreadMessagesRef = database.getReference("unreadMessages").child(chatRoomID);
unreadMessagesRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Long totalMessagesNum = dataSnapshot.getChildrenCount(); //total messages in this chatroom
//get every message
for (DataSnapshot message : dataSnapshot.getChildren()) {
String messageID = message.getKey(); //get messageID
DatabaseReference singleMessageRef = database.getReference("unreadMessages").child(chatRoomID).child(messageID);
singleMessageRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot user : dataSnapshot.getChildren()) {
String userID = user.getValue(String.class);
if( userID == currentLoggedUser.getID() ){
//the user have read this message, substract from the total messages
totalMessagesNum--;
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Log.i("total unread messages in this chat is " + totalMessagesNum);
//add the chat to the listview
chatsAdapter.add( new Chat(chatRoomID,totalMessagesNum) )
}
...
});
答案 0 :(得分:0)
您有多种选择。两个在下面: