Как на самом деле работает сохранение Firestore?

#android #firebase #synchronization #google-cloud-firestore

#Android #firebase #синхронизация #google-облако-firestore

Вопрос:

Я прочитал это в документации:

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

Для Android и iOS автономное сохранение включено по умолчанию. Чтобы отключить сохранение, установите PersistenceEnabled для параметра значение false .

В Android я создаю свою ссылку на Firestore следующим образом:

 final FirebaseFirestore db = FirebaseFirestore.getInstance();
  

Тогда я предполагаю, что сохранение включено по умолчанию.

Я попытаюсь объяснить с помощью этого изображения, что происходит:

введите описание изображения здесь

A

  • Я добавил этот документ вчера и прочитал его нормально с подключенным устройством.

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

B

  • Вчера я тоже добавил этот документ. Устройство было подключено к сети после существования этого документа, но я не читал этот документ. Он был добавлен, но никогда не читался.
  • Сегодня, когда устройство отключено, я пытаюсь прочитать этот документ, но это невозможно. (Почему не была синхронизирована во время работы устройства в сети?)

C

Вчера у меня был доступ к collection 6 , document 03000503

Сохранение не включено для всей коллекции?

Когда я добавляю документ 03030501 , этот документ не синхронизируется с устройством, когда он подключен к сети? Если я не прочитаю документ один раз в режиме онлайн, синхронизация не будет? В этом случае синхронизация выполняется не для всех документов в коллекции 6?

Мне нужно, чтобы, если я добавлю один документ в коллекцию 6, устройство синхронизировало этот документ, когда он находится в режиме онлайн, без необходимости вводить этот новый документ. Это возможно?


Вот код для чтения документов:

 public void launchFirestore() {
    final FirebaseFirestore db = FirebaseFirestore.getInstance();
    String fechaDD = strFechaHoy.substring(6, 8);
    String fechaMM = strFechaHoy.substring(4, 6);
    String fechaYYYY = strFechaHoy.substring(0, 4);

    DocumentReference calRef = db.collection(CALENDAR_PATH).document(fechaYYYY).collection(fechaMM).document(fechaDD);
    calRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
        @Override
        public void onEvent(@Nullable DocumentSnapshot calSnapshot,
                            @Nullable FirebaseFirestoreException e) {
            DocumentReference dataRef=calSnapshot.getDocumentReference(VISPERAS_ID);
            if (e != null || dataRef==null) {
                launchVolley();
                return;
            }

            if (calSnapshot != null amp;amp; calSnapshot.exists()) {
                dataRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                    @Override
                    public void onSuccess(DocumentSnapshot dataSnapshot) {
                        //Log.d(TAG,"---" dataSnapshot.toString());
                        mBreviario = dataSnapshot.toObject(Breviario.class);
                        showData();
                    }
                });
            } else {
                launchVolley();
            }
        }
    });
}
  

Ответ №1:

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

С той же страницы документации, на которую вы ссылались:

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

Если вы подумаете об этом, это имеет смысл: если Firebase будет синхронизировать все данные, которые может видеть ваш пользователь, ему придется синхронизировать потенциально всю базу данных. Это нецелесообразно на мобильном устройстве.

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

Комментарии:

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

2. Если вам нужна база данных, которая полностью реплицируется в автономном режиме, вы можете рассмотреть другие варианты.

3. Да, в будущем идея состоит в том, чтобы создать базу данных SQLite в приложении, но временно мне нужен простой способ предложить эту часть данных в автономном режиме, тогда я думаю, в Firebase. Это не вся моя база данных, а только содержимое, которое находится в коллекции lh .