Автономный кеш Firestore

Я создаю приложение для Android, которое должно работать в автономном режиме в течение нескольких недель, но может синхронизироваться сразу с удаленной БД, когда он идет в сети.

Мой вопрос: может ли Firestore быть хорошим вариантом для этого? Как долго Firestore сохраняет свой автономный кеш?

Ответ 1

Firestore может быть настроен на сохранение данных для такого автономного/автономного использования. Я рекомендую вам прочитать раздел включения автономной персистентности в документации, в котором содержится пример включения этой функции:

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(true)
        .build();
db.setFirestoreSettings(settings);

Это постоянство фактически включено по умолчанию на Android и iOS, поэтому вызов выше не требуется.

Код Android, который взаимодействует с базой данных, будет одинаковым независимо от того, подключены вы или нет, поскольку SDK просто работает одинаково. Если вы хотите определить, поступают ли данные из кэша (и, таким образом, потенциально устарели), прочитайте раздел " Прослушивание автономных данных в документах".

Данные в кеше не истекают через определенное время. Единственные две причины, по которым данные удаляются из кэша:

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

Ответ 2

Если вы прослушиваете данные в Cloud Firestore, вы получите мгновенные снимки кэшированных данных, а также обновления, когда ваше приложение сможет подключаться через Интернет:

final DocumentReference docRef = db.collection("cities").document("SF");
docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
    @Override
    public void onEvent(@Nullable DocumentSnapshot snapshot,
                        @Nullable FirebaseFirestoreException e) {
        if (e != null) {
            Log.w(TAG, "Listen failed.", e);
            return;
        }


        // Determine if the data came from the server or from cache
        String source = snapshot != null && snapshot.getMetadata().hasPendingWrites()
                ? "Local" : "Server";


        // Read the data
        if (snapshot != null && snapshot.exists()) {
            Log.d(TAG, source + " data: " + snapshot.getData());
        } else {
            Log.d(TAG, source + " data: null");
        }
    }
});

Стойкость включена по умолчанию, поэтому это поведение не требует какой-либо конфигурации.

Ответ 3

Следующий ответ следует за официальным руководством по следующей ссылке:

Размер кэша обработки

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
    .setCacheSizeBytes(FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED)
    .build();
db.setFirestoreSettings(settings);

Приведенный выше код имеет флаг, установленный для setCacheSize(), который предотвратит очистку вашего кэша. Вы также можете указать тот же размер. Если вы не установите это по умолчанию, размер будет 100 МБ.

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

Чтобы ответить на ваш вопрос, так как вам приходится работать с автономными данными в течение нескольких недель, я предлагаю каждый раз, когда данные выбираются для хранения их в форматах json/xml, поскольку хранение огромного количества данных в кеше не очень хороший подход, если задуматься о с точки зрения производительности.

Надеюсь, я помог тебе кое-что прояснить.