Firebase: В чем разница между setPersistenceEnabled и keepSynced?

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

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

Затем, согласно DOCS:

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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

Согласно Документация Firebase

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

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

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

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

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

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