2016-01-12 25 views
6

Jeśli mam listę 50 000 elementów przechowywanych w mojej bazie danych firebase i 5 pozycji zostało dodanych do tej listy od czasu ostatniego połączenia i słuchania klienta, który callback musiałbym użyć że jest uruchamiany tylko dla 5 nowych elementów, które zostały dodane?Firebase onChildDodano do nowych danych

Mam włączoną funkcję utrwalania w trybie offline na moim kliencie pod numerem Firebase.getDefaultConfig().setPersistenceEnabled(true);. Mam słuchacza związanego z aktywnością słuchania dla dzieci dodanych do referencji. Za każdym razem, gdy tworzona jest aktywność, dla wszystkich danych w odnośniku wywoływana jest nazwa onChildAdded. Czy można wywołać onChildAdded i onChildRemoved tylko dla "diff" między moją lokalną pamięcią podręczną a danymi na serwerze Firebase? A jeśli nie jest to możliwe, to aby wywołać tylko te wywołania zwrotne od onChild* po ostatniej aktualizacji z Firebase?

+0

Czy już próbował za pomocą zwrotnego onComplete dla [update()] (https://www.firebase.com/docs/web/api/firebase/update.html)? –

+0

Z dokumentacji Android wygląda na to, że updateChildren() jest podobna do setValue(). Nie wiem, jak tego użyć, aby dowiedzieć się, co próbuję zrobić. Dodałem przykład do pytania, które może sprawić, że moje starania staną się jaśniejsze. –

Odpowiedz

9

Za każdym razem, gdy czynność jest tworzona na stronie Dziecko, jest wywoływana dla wszystkich danych w pliku referencyjnym. Czy jest możliwe, aby onChildAdded i onChildRemoved były wywoływane tylko dla "diff" między moją lokalną pamięcią podręczną a danymi na serwerze Firebase?

Nie, nie jest to możliwe. Od documentation on event types:

child_added jest wyzwalany raz dla każdego istniejącego dziecka, a następnie ponownie za każdym razem nowe dziecko zostanie dodany do określonej ścieżce

Wracając do początkowego pytania:

jakiego callbacka musiałbym użyć, aby był uruchamiany tylko dla 5 nowych pozycji, które zostały dodane?

To byłoby:

ref.limitToLast(5)... 

Wymaga to jednak, że wiesz, ile przedmiotów zostały dodane do listy, ponieważ ostatnio słuchałem.

Im bardziej zwykle rozwiązaniem jest śledzić ostatniego elementu, który już widział, a następnie użyć startAt() zacząć wypalanie zdarzenia z którym ostatnio byli:

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

Można by wtedy zachować ostatni klucz widziałeś we wspólnych preferencjach.

Podobnie można zachować ostatni raz aktywność była widoczna z:

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

Następnie dodać timestamp z Firebase.ServerValue.TIMESTAMP do każdego elementu, a następnie:

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

Czy to rozwiązanie uruchomi także zdarzenia childChanged i childRemoved? –

+0

Chociaż odpowiedź Franka jest ABSOLUTNIE PRAWIDŁOWA, myślę, że powinieneś ponownie rozważyć logikę, aby obsłużyć CREATE, UPDATE i DELETE (w oparciu o działania, które sugeruje). Wydaje mi się, że możesz wziąć pod uwagę dziennik FIFO FIFO akcji C (R) UD (z logiką wygaśnięcia/eksmisji), aby złapać wszystko, co się stało, gdy różne urządzenia były off-line. – seanpj

+0

Tak, FIFO zdarzeń od ostatniego zapytania byłoby optymalne, ale wygląda na to, że zamierzam użyć elementu childEventListener tak jak jest. Podczas przechwytywania zdarzeń, zignoruję dane, które już były widoczne, przechowując je lokalnie. –

1

Powinieneś użyć on('child_changed'). Normalnie, on() służy do nasłuchu zmian danych w określonej lokalizacji. Jednak on('child_changed') powiadomi Cię

gdy dane przechowywane u dziecka (lub którykolwiek z jego potomków) zmian.

Przekaże migawkę danych do wywołania zwrotnego zawierającego nową zawartość podrzędną. Należy pamiętać, że pojedyncze zdarzenie child_changed może potencjalnie reprezentować wiele zmian dla dziecka.

+2

Czy w tym przypadku nie otrzyma listy wszystkich 50000 + 5 przedmiotów, o które nie prosi (patrz ostatni akapit pytania). – seanpj

+1

Masz rację, przypuszczam, że mógłby również użyć [limitToLast (x)] (https://www.firebase.com/docs/web/api/query/limittolast.html), aby uzyskać ostatnie X zaktualizowane dzieci. –

Powiązane problemy