Firebase onChildAdded для новых данных

если у меня есть список из 50 000 элементов, хранящихся в моей ссылке firebase, и 5 элементов были добавлены в этот список с последнего времени, когда клиент был в сети и слушал, какой обратный вызов я должен был бы использовать, чтобы он запускался только для 5 новых элементов, которые были добавлены?

у меня включено автономное сохранение на моем клиенте с Firebase.getDefaultConfig().setPersistenceEnabled(true);. У меня есть слушатель, привязанный к активности, слушающей детей, добавленных к ссылке. Каждый раз, когда активность создается onChildAdded is все данные в справочнике. Можно ли сделать onChildAdded и onChildRemoved вызывается только для "diff" между моим локальным кэшем и данными на сервере firebase? Или, если это невозможно, то вызвать только те onChild* обратные вызовы после последнего обновления от военнослужащих?

2 ответов


каждый раз, когда действие создается onChildAdded вызывается для всех данных в ссылке. Можно ли сделать onChildAdded и onChildRemoved вызываемыми только для "diff" между моим локальным кэшем и данными на сервере firebase?

нет, это невозможно. От документация по типам событий:

child_added запускается один раз для каждого существующего ребенка, а затем снова каждый раз, когда новый ребенок добавляется к указанный путь

теперь вернемся к вашему первоначальному вопросу:

какой обратный вызов я должен использовать, чтобы он срабатывал только для 5 новых элементов, которые были добавлены?

что будет:

ref.limitToLast(5)...

но это требует, чтобы вы знали, сколько элементов было добавлено в список, так как вы последний раз слушали.

более обычным решением является отслеживание последнего элемента, который вы уже видели, а затем использовать startAt() чтобы начать стрелять события с того места, где вы в последний раз были:

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

затем вы сохраните Последний ключ, который вы видели в общих настройках.

аналогично вы можете сохранить последний раз активность была видна с:

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

добавить timestamp С Firebase.ServerValue.TIMESTAMP по каждому пункту, а затем:

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

вы должны использовать on ('child_changed'). Как правило, on() используется для прослушивания изменений данных в определенном месте. Однако,on('child_changed') уведомляет вас

когда данные хранятся в ребенке (или любой из его потомков) изменения.

он передаст снимок данных обратному вызову, который содержит новое дочернее содержимое. Имейте в виду, что один child_changed событие может потенциально представлять несколько изменения в ребенке.