为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容森 2021-12-30 20:18:38
我到处搜索都没有运气。我想查询 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?
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

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

开始侦听此查询。

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

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

根据 Nick Cardoso 的评论,对于未来的访问者来说,可能会问为什么会发生这种行为,是因为他在评论中提到的原因。我还建议从这篇文章中查看 Doug Stevenson 的回答,以便更好地理解。


查看完整回答
反对 回复 2021-12-30
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

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

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


查看完整回答
反对 回复 2021-12-30
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

这是一个对我有用的解决方案:使用


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;

        }

    }

});


查看完整回答
反对 回复 2021-12-30
  • 3 回答
  • 0 关注
  • 177 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号