установить вручную кэш Firebase Firestore - PullRequest
1 голос
/ 21 февраля 2020

Я ищу решение для моей проблемы, у меня есть приложение чата, которое отображает всю переписку пользователей как Recyclerview слушатель, чтобы улучшить взаимодействие с пользователем, когда пользователь отправляет сообщение, я вручную обновляю Recyclerview с помощью текущий список плюс новое сообщение с «индикацией загрузки», а затем, когда сообщение фактически загружается в Firebase, слушатель переопределяет локальный список, который я использовал, и обновляет последнее сообщение как «выгруженный», проблема в том, что если я перестроил действие, слушатель автоматически обновит Список Recyclerview к тому, что кэшируется, поэтому пользователь больше не может видеть свое «загружаемое» сообщение, пока оно не попадет на сервер. думал, есть ли способ, которым я могу вручную установить кеш слушателя в локальный список, не дожидаясь его загрузки? если нет, может быть, есть лучшее решение, о котором я не думал? (У меня много разных чатов со многими разными пользователями, поэтому мне нужно иметь возможность извлекать каждый канал чата собственным уникальным списком)

uploading message only local and uncached

and uploaded message as overwritten by listener

1 Ответ

1 голос
/ 21 февраля 2020

Существует опция, в которой вы можете заставить запрос получать данные только из кэша. Если это то, что вам нужно, вы можете достичь этого с помощью методов DocumentReference.get (источник) и Query.get (источник) .

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

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

Так что-то вроде этого поможет:

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

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

...