Я связался со службой поддержки Firebase и, по их словам, именно так она работает в FireStore.Даже когда элементы локально кэшируются, когда прослушиватель отключен более чем на 30 минут, при следующей загрузке все документы считываются с сервера.
Я использовал следующий механизм, чтобы в некоторой степени преодолеть мою проблему.
Напишите новую облачную функцию Firebase, которая слушает записи коллекции.Он записывает время обновления коллекции в базу данных в реальном времени.
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.onItemModified = functions.firestore.document('users/{userId}/items/{itemId}').onWrite((change, context) => {
return admin.database().ref('/users/' + context.params.userId + '/items-updated-at').set(Date.now());
});
В Android при запуске приложения отключите сеть, загрузите элементы и снова включите сеть.
FirebaseFirestore.getInstance().disableNetwork().addOnCompleteListener(task -> loadItems());
private void loadItems() {
Utils.getFirestoreCollection(COLLECTION_NAME_ITEMS).get().addOnCompleteListener(task -> {
//Cache loaded items in memory
FirebaseFirestore.getInstance().enableNetwork();
}
}
ВAndroid, добавьте прослушиватель в путь к базе данных в реальном времени, где записано время последнего обновления элемента.Когда происходит событие обновления, прочитайте элементы еще раз и обновите кэш памяти.Сохраните время обновления элемента в общих настройках Android, поэтому при следующем событии обновления проверьте, больше ли обновленное время RTDB, чем сохраненное время, и снова считывайте элементы, только если время обновления RTDB превышает сохраненное время.