Прослушивание изменений метаданных в базе данных Firebase Firestore

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

   mDb.collection("Users_Collection").document(mAuth.getUid()).collection("Recipients")
                .document(psychichObj.getUid()).collection("Messages").orderBy("time").limit(30)
                .addSnapshotListener(MetadataChanges.INCLUDE, new EventListener<QuerySnapshot>() {
                    @Override
                    public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                        if (e==null){
                            for (DocumentChange dc:queryDocumentSnapshots.getDocumentChanges()){
                                switch (dc.getType()){
                                    case ADDED:
                                        Log.d("chatevents", "onEvent:Added ");
                                        messgaesDataClass msg = dc.getDocument().toObject(messgaesDataClass.class);
                                        messages.add(msg);
                                        chatAdapter.notifyDataSetChanged();
                                        messagesRecycler.smoothScrollToPosition(messages.size());
                                        break;
                                    case REMOVED:
                                        Log.d("chatevents", "onEvent:Removed ");

                                    case MODIFIED:
                                        Log.d("chatevents", "onEvent:Modiefied ");

                                }
                            }
                        }
                    }
                });

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
2 705
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При передаче Изменения метаданных методу addSnapshotListener (MetadataChanges metadataChanges, прослушиватель EventListener) запроса:

Indicates whether metadata-only changes (i.e. only Query.getMetadata() changed) should trigger snapshot events.

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

I want to know how can i listen for a msg object that is in local cache

В этом случае вам следует рассмотреть возможность использования метода isFromCache() SnapshotMetadata:

Log.d(TAG, "isFromCache: " + documentSnapshot.getMetadata().isFromCache());

Когда я в сети, он печатает:

isFromCache: false

Когда я не в сети, он печатает:

isFromCache: true

Итак, когда я отправляю сообщение, и оно еще не отправлено на сервер, чем документ слушателей. Добавленный случай будет выполняться в моем операторе переключения с ожидающим тегом, верно? поэтому, когда я в сети и его отправляют на сервер, будет запускаться дело document.Added снова или дело document.Modified будет запускаться?

IO Devs 19.01.2019 11:24

Нет, onEvent:Added будет распечатан один раз для каждого элемента, соответствующего вашему запросу, и второй раз для каждого нового элемента, добавленного в этом конкретном месте с MetadataChanges, который соответствует в этот конкретный момент. Если вы хотите знать, когда данные фиксируются на серверах Firebase, вам нужно использовать CompleteListener.

Alex Mamo 19.01.2019 12:31

Если есть потеря сетевого подключения (нет сетевого подключения на пользовательском устройстве), ни onSuccess(), ни onComplete() не запускаются. Такое поведение имеет смысл, поскольку задача считается выполненной только тогда, когда данные были зафиксированы (или отклонены) на серверах Firebase. Теперь нормально?

Alex Mamo 19.01.2019 12:32

Другие вопросы по теме