2016-12-15 4 views
1

Ich entwickle eine Chat-App, die viele Chatrooms hat, wenn jemand auf den Chat-Room geantwortet hat, wird er automatisch abonniert.Wie kann ich ungelesene Nachrichten abfragen?

My Firebase Datenbank-Struktur ist:

chats 
--chatID 
----chatName 
----user 

unreadMessages 
--chatID 
----messageID 
------userID 

Ich habe versucht, den Code so viel wie möglich für Sie zu kommentieren, so wäre es einfacher zu lesen.

Nun, auf meiner MainActivity Frage ich alle Chatrooms zu bekommen, und ich möchte auch die ungelesenen Nachrichten Nummer zu bekommen. Dies erfordert mehrere verschachtelte Abfragen, und das Problem ist, dass sie alle zu unterschiedlichen Zeiten auftreten. Daher kann ich nicht wissen, wann die inneren Schleifen beendet sind und wann die Firebase-Abfragen enden.

Es bedeutet, dass es in der letzten Zeile den Chatroom mit 0 ungelesenen Nachrichten wegen des Timings hinzufügt.

Hoffe, du könntest mir hier helfen, ich habe fast alles ausprobiert, und stundenlanges Frustrieren hat mir überhaupt nicht geholfen.

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

     } 

     ... 

    }); 

Antwort

0

Sie haben mehrere Optionen. Zwei sind unten:

  1. Sie können die Anzahl der Unreadmessage in Firebase speichern und direkt abfragen.
  2. Sie können Callbacks verwenden, damit Sie das Callback aufrufen und die zweite Abfrage ausführen, wenn Sie das Ergebnis von Ihrer ersten Abfrage abrufen. Sobald die zweite Abfrage zurückgegeben wird, können Sie die endgültigen Werte zu Ihrem chatsAdapter hinzufügen.
Verwandte Themen