我用监听器监听对集合的更改
query.addSnapshotListener(new EventListener<QuerySnapshot>()
当我添加第一个文档时,侦听器将得到它,并且它可以按我想要的方式工作,但是随后,当我添加第二个文档时,侦听器将得到第二个文档和,然后再次获取第一个文件。第三,它记录此第三文件,其余的记录2,依此类推。
我能否使我的侦听器在添加时仅获取最新文档,而不是所有文档?
编辑:
query = chatCollectionRef.whereEqualTo("receiverID", userID).whereEqualTo("senderID", targetID);
registration = query.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
if (e != null) {
Log.w("ListenerError", "Listen Failed");
return;
}
for (QueryDocumentSnapshot doc : queryDocumentSnapshots) {
Log.d("ListenerLog", "New Document in Listener")
Item item= doc.toObject(Item.class);
itemList.add(item);
recyclerAdapter.notifyDataSetChanged();
}
}
}
问题在于,当添加第一个文档时,我的监听器和recyclerview会显示此
然后,当我添加第二个文档时,侦听器将获取所有两个文档,而不仅仅是最新的文档,而且我的recyclerView看起来像这样
答案 0 :(得分:1)
快照将始终返回完整的数据, 如果您只想获取datqa中的更改,则应使用firestore中记录的以下代码:
db.collection("cities").whereEqualTo("state", "CA").addSnapshotListener(new EventListener<QuerySnapshot>()
{
@Override
public void onEvent(@Nullable QuerySnapshot snapshots,
@Nullable FirebaseFirestoreException e) {
if (e != null) {
Log.w(TAG, "listen:error", e);
return;
}
for (DocumentChange dc : snapshots.getDocumentChanges()) {
switch (dc.getType()) {
case ADDED:
Log.d(TAG, "New city: " + dc.getDocument().getData());
break;
case MODIFIED:
Log.d(TAG, "Modified city: " + dc.getDocument().getData());
break;
case REMOVED:
Log.d(TAG, "Removed city: " + dc.getDocument().getData());
break;
}
}
}
});
答案 1 :(得分:0)
查询侦听器始终仅发送已更改的文档,但是firebase客户端SDK会将其与其他文档结合在一起,然后将它们交付给您,这样您就不必编写逻辑来编写用于不同条件的特定代码。您应该查看Firebase团队的以下视频,他们在视频中解释“如何使用Firestore实施实时功能”
https://www.youtube.com/watch?v=3aoxOtMM2rc&list=PLl-K7zZEsYLluG5MCVEzXAQ7ACZBCuZgZ&index=10