2016-10-22 2 views
14

Я думал, что все время, когда я использовал следующие, все данные для чата будут доступны в автономном режиме в любое время. Что-то не так, и все узлы загружаются с сервера.Firebase: В чем разница между setPersistenceEnabled и keepSynced?

FirebaseDatabase.getInstance().setPersistenceEnabled(true); 

Тогда, согласно DOCS:

Постоянство Поведение: Обеспечивая настойчивость, любые данные, которые мы синхронизироваться в то время как в Интернете будет сохраняться на диске и доступны в автономном режиме, даже когда мы рестарт приложение. Это означает, что наше приложение будет работать так же, как и в режиме онлайн, используя локальные данные, хранящиеся в кеше.

Если данные уже будут доступны в автономном режиме, когда setPersistenceEnabled(true);, зачем мне keepSynced(true)?

DatabaseReference r = FirebaseDatabase.getInstance().getReference("chat/roomid"); 
r.keepSynced(true); 

ответ

14

Клиент базы данных Firebase в приложении можно сохранить данные из базы данных в двух местах: в памяти и/или на диске.

  1. При подключении слушателя он синхронизирует данные из базы данных с представлением в памяти в вашем приложении.
  2. Если вы включили сохранение, то данные автоматически также сохранен на диске.
  3. Когда вы отсоединяете последний прослушиватель от местоположения, данные для этого местоположения выводятся из памяти. Но он не удаляется с диска.

Когда вы синхронизировали местоположение, клиент по существу прикрепляет пустой приемник к этому местоположению. Таким образом, данные в приложении всегда будут в курсе того, что находится в базе данных на сервере (если есть сетевое подключение). Если вы не активировали сохранение, данные будут постоянно обновляться в памяти. Если вы включили сохранение, он также будет обновляться на диске.

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

Например, если у вас есть приложение с основными деталями, в котором вы часто отскакиваете от списка имен элементов до деталей каждого элемента. В этом случае сохранение списка имен элементов синхронизируется, что избавит вас от необходимости перезагружать эти данные, когда пользователь вернется с экрана подробностей.

Конечно, вы можете просто держать слушателя в данных, что по сути является тем, что keepSynced делает за кулисами.

+0

FirebaseDatabase.getInstance(). SetPersistenceEnabled (true); не делает чат доступным для офлайн – Gattsu

+0

@ maveň, проверьте приведенный ниже ответ и мои разъяснения по нему. – mradzinski

+0

@Frank van Puffelen, если функция persistence включена и приложение завершено, то в следующий раз, когда приложение запускается, Firebase копирует всю всю базу данных с сервера на память и на диск или просто копирует эти элементы с измененного сервера. То есть он может определить, что такое дельта между данными на диске устройства и данными на сервере и только перемещать данные дельта в телефон? – Gruntcakes

0

Согласно Firebase documentation

По умолчанию клиент Firebase будет держать данные в памяти, когда приложение работает, но не тогда, когда он будет перезапущен. Установив это значение равным true, данные будут сохраняться на устройстве (диске) хранилище и, таким образом, будут доступны снова, когда приложение будет перезапущено (даже если в это время нет сетевого подключения). Обратите внимание, что этот метод должен быть вызван перед созданием вашей первой ссылки Firebase и должен быть вызван только один раз для каждого приложения.Если ваше приложение использует Firebase Authentication, клиент автоматически сохранит токен аутентификации пользователя при перезапуске, даже если не поддерживается постоянство. Но если токен авторизации истек в автономном режиме и вы включили сохранение, клиент будет приостанавливать операции записи до тех пор, пока вы не повторите проверку подлинности (или явно вызываете unauth), чтобы предотвратить отправку ваших писем не прошедших проверку подлинности и отказ из-за правил безопасности.

Обратите внимание, что он говорит, что данные будут сохраняться на диске и будут доступны, когда приложения рестарт. Если вы посмотрите на life cycle of an Activity, вы увидите, что действие прекращается при изменении другой активности. Итак, пока ваше приложение все еще открыто, а пользователь только переходит к другим действиям, данные остаются в силе.

Но не говорите ничего об убийстве вашего приложения и сохраняйте данные. Вот почему вам нужно keepSynced():

Позвонив keepSynced (истинную) на месте, данные для этого места будет автоматически загружены и синхронизированы, даже тогда, когда нет слушателей не прикрепляются для этого места. Кроме того, , в то время как местоположение сохраняется синхронизированным, оно не будет выведено из кэша постоянного диска.

Pay, когда он Пенза-говорит «в то время как местоположение хранится синхронизировано, он не будет выселен из постоянного дискового кэша», это означает, что если вы не используете keepSynced(true) ваши данные могут быть сброшен путем, когда приложение убит/закрыто.

Итак, чтобы сохранить и продолжить данные после того, как ваше приложение будет убито, вам необходимо использовать как FirebaseDatabase.getInstance().setPersistenceEnabled(true);, так и keepSynced(true).

+2

Чтобы уточнить это: '' 'keepSynced (true)' '' следует вызывать из тех ссылок, которые вам нужно синхронизировать (если в вашем требовании не указано, что вы хотите сохранить синхронизацию всего вашего устройства базы данных). Другими словами, если у вас есть такая структура, как '' 'users/{userUID}/tasks''', и вы хотите, чтобы задачи синхронизировались, вы должны вызывать' '' keepSynced (true) '' 'при обращении к этому пути. – mradzinski

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