Firestore: выборка данных с сервера, только если есть обновление, иначе выборка из кэша - PullRequest
0 голосов
/ 25 апреля 2020

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

firestoreInstance.collection("makes-models")
            .whereEqualTo("type", "2W")
            .get()
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    makesListMutableLiveData.setValue(null);
                    Log.e(TAG, e.getMessage());
                }
            }).addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if(task.isSuccessful()) {
                        List<Make> makes = task.getResult().toObjects(Make.class);
                        makesListMutableLiveData.setValue(makes);
                    } else {
                        makesListMutableLiveData.setValue(null);
                        Log.e(TAG, task.getException().getMessage());
                    }
                }
            });

Теперь, что я хочу, я должен получать данные только с сервера, если есть какие-либо изменения, иначе данные должны быть получены из CACHE. только. Согласно документации, которую я прочитал, есть способы получить

  1. только из кэша
  2. только с сервера
  3. проверить сервер и, если не удается подключиться из-за проблема с сетью, выборка из локальной сети.

То, что я хочу, это:

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

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

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

Вот некоторые приемлемые альтернативы:

  • Пусть сервер уведомит клиента о любых данных, которые могли измениться, с помощью какого-либо уведомления pu sh. Сервер должен знать, какие документы интересны для клиента, и клиент должен будет извлекать только те документы, которые необходимы.

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

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

1 голос
/ 25 апреля 2020

Когда вы делаете вызов get(), Firestore SDK всегда будет пытаться получить данные с сервера, независимо от того, изменены данные или нет. Вы сможете получить данные из кеша, только если устройство отключится. Однако, если вы пытаетесь прослушивать изменения в режиме реального времени, согласно официальной документации:

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

In Другими словами, если сервер сообщает, что у вас нет новых добавленных / обновленных / удаленных документов, вы получите данные из кэша. Однако есть кое-что еще, что вы должны позаботиться о продолжительности времени, в течение которого вы можете получать данные из кэша :

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

Другой возможный платеж может также исходить от :

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

Но все эти сборы в порядке как устроен Firestore.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...