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
событие может потенциально представлять несколько изменения в ребенке.