如何查询未读邮件num?

时间:2016-12-15 23:02:17

标签: android firebase firebase-realtime-database

我正在开发一个有许多聊天室的聊天应用程序,当有人回复聊天室时,他会自动订阅它。

我的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) )

        }

        ...

    });

1 个答案:

答案 0 :(得分:0)

您有多种选择。两个在下面:

  1. 您可以将未读消息计数存储在firebase中并直接查询。
  2. 您可以使用回调,以便在从第一个查询返回结果时调用回调,然后执行第二个查询。第二个查询返回后,您可以将最终值添加到chatsAdapter。