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

我到处搜索都没有运气。我想查询 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;

            }

        }

    }

});

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


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



慕容森
浏览 178回答 3
3回答

人到中年有点甜

当您在 Cloud Firestore 中侦听实时更改时,使用 Firestore Query 的addSnapshotListener()方法,它:开始侦听此查询。这基本上意味着第一次附加侦听器时,您将获得与该特定查询相对应的所有文档。此外,每次文档中的属性发生更改时,您都会根据该更改收到通知。显然,只有在侦听器保持活动状态且未被移除时才会发生这种情况。不幸的是,Firestore 侦听器不能那样工作,因此您不能跳过“case ADDED”。相反,您可以做的是在每个用户对象下添加一个Date属性(这是您添加它的方式)并根据此新属性在客户端查询您的数据库,以查找自上次以来已更改的所有文档。根据 Nick Cardoso 的评论,对于未来的访问者来说,可能会问为什么会发生这种行为,是因为他在评论中提到的原因。我还建议从这篇文章中查看 Doug Stevenson 的回答,以便更好地理解。

宝慕林4294392

有一个选项可以检查 querySnapshot 是否来自缓存,更改返回 falseif(querySnapshot.getMetadata().isFromCache())&nbsp;return

慕码人8056858

这是一个对我有用的解决方案:使用AtomicBoolean isFirstListener = new AtomicBoolean(true);然后在事件方法上if (isFirstListener.get()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isFirstListener.set(false);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //TODO Handle the entire list.&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }这是我的项目中的示例代码:&nbsp;final AtomicBoolean isFirstListener = new AtomicBoolean(true);&nbsp;mDb.collection("conversation_log").document(room_id).collection("messages").orderBy("sent_at")&nbsp; &nbsp; .addSnapshotListener(new EventListener<QuerySnapshot>() {&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void onEvent(@Nullable QuerySnapshot value2, @Nullable FirebaseFirestoreException e) {&nbsp; &nbsp; &nbsp; &nbsp; if (isFirstListener.get()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isFirstListener.set(false);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //TODO Handle the entire list.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }});
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java