Firebase Firestore Cache - PullRequest
       6

Firebase Firestore Cache

0 голосов
/ 29 октября 2018

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

public void loadThings() {
    FirebaseFirestore db = FirebaseFirestore.getInstance();

    db.collection("medidas").whereEqualTo("id_user", mAuth.getCurrentUser().getUid()).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                QuerySnapshot snapshot = task.getResult();
                int tam = snapshot.getDocuments().size();
                data = new String[tam];
                StringBuilder temp;
                DocumentSnapshot doc;
                for (int i = 0; i < tam; i++) {
                    temp = new StringBuilder();
                    doc = snapshot.getDocuments().get(i);

                    temp.append("Date: ").append(doc.get("fecha")).append(";");
                    temp.append("Min: ").append(doc.get("min")).append(";");
                    temp.append("Max: ").append(doc.get("max")).append(";");
                    temp.append("Avg: ").append(doc.get("avg")).append(";");


                    data[i] = temp.toString();
                }
                if(tam==0)
                {
                    noMeasures();
                }
            }
            else
            {
                data=null;
            }
            mLoadingIndicator.setVisibility(View.INVISIBLE);
            mMeasuresAdapter.setMeasuresData(data);
            if (null == data) {
                showErrorMessage();
            } else {
                showMeasuresDataView();
            }
        }
    });
}

Особая проблема заключается в том, что иногда требуется много времени, чтобы показать данные (более 10 секунд), в то время как некоторые другие показывают данные сразу. Поскольку телефон находится в режиме полета, очевидно, что данные, которые я получаю, поступают из кеша. Однако я не понимаю, почему это иногда занимает так много времени. Есть ли какой-то способ явно указать firestore, чтобы он доставлял данные из кэша, вместо того, чтобы пытаться получить их с сервера? Заранее спасибо

1 Ответ

0 голосов
/ 30 октября 2018

Есть ли какой-нибудь способ явно указать firestore, чтобы он доставлял данные из кэша вместо попыток получить их с сервера?

Да, начиная с обновления версии 16.0.0 SDK, вы можете добиться этого с помощью DocumentReference.get (источник) и Query.get (источник) методы.

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

Таким образом, вы можете передать в качестве аргумента DocumentReference или Query источник, чтобы мы могли принудительно получить данные с server only, chache only или попытаться выполнить сервер и вернуться к кешу .

Так что в коде может выглядеть так:

FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference docIdRef = db.collection("yourCollection").document("yourDocument");
docIdRef.get(Source.CACHE).addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
    @Override
    public void onSuccess(DocumentSnapshot documentSnapshot) {
        //Get data from the documentSnapshot object
    }
});

В этом случае мы принудительно извлекаем данные только из CACHE. Если вы хотите, чтобы данные извлекались только из SERVER, вы должны передать в качестве аргумента метод get(), Source.SERVER. Больше информации здесь .

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