我到处搜寻都没有运气。我想查询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;
}
}
}
});
查询和更改total
时,第一次触发添加(ADDED)的情况(这是需要的)。我只需要更改,而不想要所有初始数据,我不需要它。如何获得?
请帮助我,这是我项目的最后一部分。 case MODIFIED
如何跳过?
答案 0 :(得分:4)
当您在Cloud Firestore中监听实时更改时,使用Firestore Query的addSnapshotListener()方法,它会:
开始收听此查询。
这基本上意味着,第一次连接侦听器时,您将获得与该特定查询相对应的所有文档。此外,每次文档中的属性更改时,都会根据该更改通知您。显然,只有在侦听器保持活动状态且未被删除的情况下,这种情况才会发生。
不幸的是,Firestore侦听器无法采用这种方式,因此您不能跳过该“案例添加”。您可以做的是,在每个用户对象下添加Date
属性(您可以通过 this 添加属性)并在客户端上查询数据库,此新属性,用于自上次以来已更改的所有文档。
根据尼克·卡多佐(Nick Cardoso)的评论,对于将来的游客来说,可能会问为什么这种行为发生是因为他在评论中提到的原因。我还建议您从post中查看道格·史蒂文森(Doug Stevenson)的答案,以便更好地理解。
答案 1 :(得分:1)
有一个选项可以检查querySnapshot是否来自缓存,更改是否返回false
if(querySnapshot.getMetadata().isFromCache()) return
答案 2 :(得分:0)
以下是为我工作的解决方案: 使用
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;
}
}
});