2016-01-12 15 views
6

Wenn ich eine Liste von 50.000 Elementen in meiner Firebase-Referenz gespeichert habe, und 5 Elemente zu dieser Liste seit dem letzten Mal hinzugefügt wurden, war der Client online und zuhören, welchen Callback würde ich verwenden müssen dass es nur für die 5 neuen Elemente ausgelöst wird, die hinzugefügt wurden?Firebase onChildAdded für neue Daten

Ich habe Offline-Persistenz auf meinem Client mit Firebase.getDefaultConfig().setPersistenceEnabled(true); aktiviert. Ich habe einen Zuhörer, der an eine Aktivität gebunden ist, die auf Kinder hört, die einer Referenz hinzugefügt werden. Jedes Mal, wenn die Aktivität erstellt wird, wird onChildAdded für alle Daten in der Referenz aufgerufen. Ist es möglich, onChildAdded und onChildRemoved nur für "diff" zwischen meinem lokalen Cache und den Daten auf dem Firebase-Server aufzurufen? Oder wenn das nicht möglich ist, nur die onChild* Callbacks nach dem letzten Update von Firebase auszulösen?

+0

Haben Sie schon versucht, den onComplete Rückruf mit für [update()] (https://www.firebase.com/docs/web/api/firebase/update.html)? –

+0

Aus der Android-Dokumentation sieht updateChildren() ähnlich wie setValue() aus. Ich weiß nicht, wie ich das verwenden soll, um herauszufinden, was ich zu tun versuche. Ich habe der Frage ein Beispiel hinzugefügt, das das, was ich versuche, klarer machen könnte. –

Antwort

9

Jedes Mal, wenn die Aktivität erstellt wird, wird onChildAdded für alle Daten in der Referenz aufgerufen. Ist es möglich, onChildAdded und onChildRemoved nur für "diff" zwischen meinem lokalen Cache und den Daten auf dem Firebase-Server aufzurufen?

Nein, das ist nicht möglich. Von den documentation on event types:

child_added für jedes bestehendes Kind einmal ausgelöst wird und dann jedes Mal wieder ein neues Kind

Nun zurück zu Ihrer ersten Frage zu dem angegebenen Pfad hinzugefügt:

Welchen Callback müsste ich verwenden, damit er nur für die 5 neuen Elemente ausgelöst wird, die hinzugefügt wurden?

Das wäre:

ref.limitToLast(5)... 

Aber dies setzt voraus, dass Sie wissen, wie viele Elemente in die Liste aufgenommen wurden, seit Sie das letzte Mal zugehört.

Die üblichere Lösung, den Überblick über den letzten Punkt zu halten, haben Sie bereits gesehen und startAt() zu starten Sie dann verwenden, um Brennen Ereignisse aus, wo Sie waren zuletzt:

ref.orderByKey().startAt("-Ksakjhds32139")... 

Sie würden dann die letzte Taste halten Sie haben in gemeinsamen Einstellungen gesehen.

Ebenso können Sie das letzte Mal halten die Aktivität war sichtbar mit:

long lastActive = new Date().getTime(); 

Dann ein timestamp mit Firebase.ServerValue.TIMESTAMP jedes Element hinzufügen und dann:

ref.orderByChild("timetstamp").startAt(lastActive+1)... 
+0

Würde diese Lösung auch childChanged- und childRemoved-Ereignisse auslösen? –

+0

Obwohl Franks Antwort ABSOLUT RICHTIG ist, denke ich, dass Sie die Logik überdenken sollten, um mit CREATE, UPDATE und DELETE umzugehen (basierend auf den Aktionen, die er vorschlägt). Es scheint mir, dass Sie ein Firebase-basiertes FIFO-Journal für C (R) UD-Aktionen (mit Ablauf-/Räumungslogik) in Betracht ziehen sollten, um alles zu erfassen, was passierte, wenn verschiedene Geräte offline waren. – seanpj

+0

Ja, ein FIFO von Ereignissen seit der letzten Abfrage wäre optimal, aber es sieht so aus, als würde ich einen childEventListener verwenden, wie er ist. Beim Erfassen von Ereignissen ignoriere ich Daten, die bereits gesehen wurden, indem ich sie lokal speichere. –

1

Sie sollten on('child_changed') verwenden. Normalerweise wird on() verwendet, um auf Datenänderungen an einem bestimmten Ort zu warten. Allerdings on('child_changed') benachrichtigt Sie

, wenn die in einem Kind gespeicherten Daten (oder einem seiner Nachkommen) ändert.

Es wird ein Daten-Snapshot an den Rückruf übergeben, der die neuen untergeordneten Inhalte enthält. Denken Sie daran, dass ein einzelnes Ereignis child_changed potenziell mehrere Änderungen am Kind darstellen kann.

+2

Würde er in diesem Fall nicht eine Liste aller 50000 + 5 Punkte bekommen, die er nicht verlangt (siehe letzten Absatz der Frage). – seanpj

+1

Sie haben recht, ich nehme an, er könnte auch [limitToLast (x)] (https://www.firebase.com/docs/web/api/query/limittolast.html) verwenden, um die letzten X aktualisierten Kinder zu erhalten. –