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

Sky*_*ker 5 java android firebase google-cloud-firestore

我到处搜寻都没有运气。我想查询Firestore以获取类型为admin的所有用户。就像是:

SELECT * FROM users WHERE type=admin
Run Code Online (Sandbox Code Playgroud)

在属性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;
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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

Ale*_*amo 5

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

开始收听此查询。

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

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

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


Art*_*ski 5

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

if(querySnapshot.getMetadata().isFromCache()) return
Run Code Online (Sandbox Code Playgroud)