2017-05-04 5 views
0

Ist es möglich, nur die untergeordneten Elemente abzurufen, die hinzugefügt/geändert wurden, nachdem das Wertereignislistener eingerichtet wurde? Aus meiner Erfahrung scheint es, jedes Kind zu holen.Nur geänderte Daten abrufen, nachdem ValueEventListener initiiert wurde

Zum Beispiel in einem Chat-basierte Anwendung, wenn ich die letzten 10 Nachrichten mit Abfrage als Initialisierungsschritt

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
Query queryRef = database.getReference(MESSAGES) 
     .limitToLast(messagesToLoad); 

queryRef.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 

     // Load then new chat message 
     ChatMessage message = dataSnapshot.getValue(ChatMessage.class); 
     if (message != null) 
     { 
      mMessageList.add(0, message); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

Danach holen wollte, möchte ich ein ValueEvenListener anschließen, die auf die Veränderungen zuhört.

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
DatabaseReference ref = database.getReference(MESSAGES); 

ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     ChatMessage message = dataSnapshot.getValue(ChatMessage.class); 
     if (message != null) { 
      mMessageList.add(0, message); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

EDIT: ich zu einem childEventListener für umgewandelt habe, wenn neue Nachrichten hinzugefügt werden, aber ich kann natürlich nicht, dass mit der einzigen ValueEventListener Abfrage tun. Ich habe es auch angepasst, so dass sie jetzt die gleiche Datenbankreferenz verwenden (childEventListener wird nur bei der Erstellung des Fragments aufgerufen), aber das scheint sich nicht viel zu ändern.

Dies ist nur um zu vermeiden, einen ganzen Heap von Daten ohne Grund zu holen.

+0

Haben Sie dieses Problem gelöst? Ich habe ein ähnliches Problem wie Ihres und nicht sicher, was zu tun ist. –

Antwort

1

sollten Sie child event listener

+0

Sorry für den vorherigen Kommentar, aber nach dem Testen funktioniert dies nicht. Es lädt immer noch alle Kinder. – ReallyGoodPie

0

Ihr Ansatz ist anders als wie Firebase funktioniert. Wenn wir über Firebase sprechen, ist alles über listeners. Da Firebase ein Real Time Database ist, wird jede Änderung, die in Ihrer Datenbank vorgenommen wird, in Echtzeit bereitgestellt. Sie werden für Änderungen bemerkt, solange Ihr Listener nicht entfernt wird. Sie können nur hören stoppen, wenn Sie den Hörer in Ihrer onDestroy Methode wie folgt entfernen:

databaseReference.removeEventListener(valueEventListener); 

Wenn Sie wissen möchten, welche die neuen Nachrichten sind nicht notwendig, um die Zuhörer zu entfernen. Sie können Ihrer Nachricht ein anderes Feld hinzufügen, sagen wir read, und setzen Sie sie auf false, wenn die Nachricht nicht gelesen wurde, und true, wenn sie gelesen wurde.

Ich hoffe, es hilft.

Verwandte Themen