2016-01-12 2 views
6

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

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

+0

Вы уже пытались с помощью обратного вызова OnComplete для [update()] (https://www.firebase.com/docs/web/api/firebase/update.html)? –

+0

Из документации по Android, похоже, что updateChildren() похож на setValue(). Я не знаю, как использовать это, чтобы понять, что я пытаюсь сделать. Я добавил пример к вопросу, который может сделать то, что я пытаюсь достичь более ясным. –

ответ

9

Каждый раз, когда действие создается onChildAdded, вызывается для всех данных в ссылке. Возможно ли, чтобы onChildAdded и onChildRemoved вызывались только для «diff» между моим локальным кешем и данными на сервере firebase?

Нет, это невозможно. Из documentation on event types:

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)... 
+0

Будет ли это решение также запускать события childChanged и childRemoved? –

+0

Хотя ответ Фрэнка АБСОЛЮТНО ПРАВИЛЬНО, я думаю, вы должны пересмотреть логику, чтобы обрабатывать CREATE, UPDATE и DELETE (на основе действий, которые он предлагает). Мне кажется, что вы можете рассмотреть журнал FIFO на основе Firebase действий C (R) UD (с логикой истечения/выселения), чтобы поймать все, что произошло, когда разные устройства были автономными. – seanpj

+0

Да, FIFO событий, поскольку последний запрос был бы оптимальным, но похоже, что я буду использовать childEventListener как есть. При захвате событий я проигнорирую данные, которые уже были замечены путем их локального хранения. –

1

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

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

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

+2

Разве он не получил бы в этом случае список всех 50000 + 5 предметов, которые он не просит (см. Последний параграф вопроса). – seanpj

+1

Вы правы, я полагаю, что он мог бы использовать [limitToLast (x)] (https://www.firebase.com/docs/web/api/query/limittolast.html), чтобы получить последние обновленные дети X. –

 Смежные вопросы

  • Нет связанных вопросов^_^