3 回答

TA貢獻1895條經驗 獲得超7個贊
當您在 Cloud Firestore 中偵聽實時更改時,使用 Firestore Query 的addSnapshotListener()方法,它:
開始偵聽此查詢。
這基本上意味著第一次附加偵聽器時,您將獲得與該特定查詢相對應的所有文檔。此外,每次文檔中的屬性發生更改時,您都會根據該更改收到通知。顯然,只有在偵聽器保持活動狀態且未被移除時才會發生這種情況。
不幸的是,Firestore 偵聽器不能那樣工作,因此您不能跳過“case ADDED”。相反,您可以做的是在每個用戶對象下添加一個Date
屬性(這是您添加它的方式)并根據此新屬性在客戶端查詢您的數據庫,以查找自上次以來已更改的所有文檔。
根據 Nick Cardoso 的評論,對于未來的訪問者來說,可能會問為什么會發生這種行為,是因為他在評論中提到的原因。我還建議從這篇文章中查看 Doug Stevenson 的回答,以便更好地理解。

TA貢獻2021條經驗 獲得超8個贊
有一個選項可以檢查 querySnapshot 是否來自緩存,更改返回 false
if(querySnapshot.getMetadata().isFromCache()) return

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;
}
}
});
添加回答
舉報