如何在Firestore Firebase中跳过初始数据并仅触发新更新?

时间:2018-11-05 14:13:44

标签: java android firebase google-cloud-firestore

我到处搜寻都没有运气。我想查询Firestore以获取类型为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;
            }
        }
    }
});

查询和更改total时,第一次触发添加(ADDED)的情况(这是需要的)。我只需要更改,而不想要所有初始数据,我不需要它。如何获得?

请帮助我,这是我项目的最后一部分。 case MODIFIED如何跳过?

3 个答案:

答案 0 :(得分:4)

当您在Cloud Firestore中监听实时更改时,使用Firestore Query的addSnapshotListener()方法,它会:

  

开始收听此查询。

这基本上意味着,第一次连接侦听器时,您将获得与该特定查询相对应的所有文档。此外,每次文档中的属性更改时,都会根据该更改通知您。显然,只有在侦听器保持活动状态且未被删除的情况下,这种情况才会发生。

不幸的是,Firestore侦听器无法采用这种方式,因此您不能跳过该“案例添加”。您可以做的是,在每个用户对象下添加Date属性(您可以通过 this 添加属性)并在客户端上查询数据库,此新属性,用于自上次以来已更改的所有文档。

根据尼克·卡多佐(Nick Cardoso)的评论,对于将来的游客来说,可能会问为什么这种行为发生是因为他在评论中提到的原因。我还建议您从post中查看道格·史蒂文森(Doug Stevenson)的答案,以便更好地理解。

答案 1 :(得分:1)

有一个选项可以检查querySnapshot是否来自缓存,更改是否返回false

if(querySnapshot.getMetadata().isFromCache()) return

答案 2 :(得分:0)

以下是为我工作的解决方案: 使用

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;
        }
    }
});

参考:http://example.com/page#1