亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何跳過初始數據并僅觸發 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 關注
  • 155 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號