Как пропустить исходные данные и запускать только новые обновления в Firestore Firebase? - PullRequest
0 голосов
/ 05 ноября 2018

Я искал везде без удачи. Я хочу запросить Firestore, чтобы получить всех пользователей, ГДЕ тип is admin. Что-то вроде:

SELECT * FROM users WHERE type=admin

, но только , когда свойство total изменяется. Если я использую:

users.whereEqualTo("type", "admin").addSnapshotListener(new EventListener<QuerySnapshot>() {
    @Override
    public void onEvent(@Nullable QuerySnapshot snapshots, @Nullable FirebaseFirestoreException e) {
        for (DocumentChange dc : snapshots.getDocumentChanges()) {
            switch (dc.getType()) {
                case ADDED:
                    //Not trigger
                    break;
                case MODIFIED:
                    //Trigger
                    break;
                case REMOVED:
                    //
                    break;
            }
        }
    }
});

Случай ADDED запускается в первый раз, когда я запрашиваю, а когда total изменяется, case MODIFIED запускается снова (это то, что нужно). Я хочу только изменения, а не все исходные данные, мне это не нужно. Как получить это?

Пожалуйста, помогите мне, это последняя часть моего проекта. Как пропустить это case ADDED?

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Вот решение, которое работает для меня: используйте

AtomicBoolean isFirstListener = new AtomicBoolean(true);

и затем метод события

if (isFirstListener.get()) {
                    isFirstListener.set(false);
                    //TODO Handle the entire list. 
                    return;
                }

Вот пример кода из моего проекта:

 final AtomicBoolean isFirstListener = new AtomicBoolean(true);
 mDb.collection("conversation_log").document(room_id).collection("messages").orderBy("sent_at")
    .addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(@Nullable QuerySnapshot value2, @Nullable FirebaseFirestoreException e) {
        if (isFirstListener.get()) {
            isFirstListener.set(false);
            //TODO Handle the entire list.
            return;
        }
    }
});

ссылка: ответ

0 голосов
/ 08 августа 2019

Существует возможность проверить, является ли querySnapshot из кэша, изменения возвращают false

if(querySnapshot.getMetadata().isFromCache()) return
0 голосов
/ 05 ноября 2018

Когда вы прослушиваете изменения в Cloud Firestore для изменений в реальном времени, используя метод addSnapshotListener () запроса Firestore, это:

Начинает прослушивание этого запроса.

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

К сожалению, слушатели Firestore не работают таким образом, поэтому вы не можете пропустить этот "case ADDED". Вместо этого вы можете добавить add под каждым объектом пользователя свойство Date (, это , как вы можете добавить его) и запросить базу данных на клиенте, в соответствии с этим новое свойство для всех документов, которые изменились с предыдущего раза.

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

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