Firestore查询监听器

时间:2018-11-22 23:51:14

标签: android firebase google-cloud-firestore

我用监听器监听对集合的更改

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会显示此enter image description here

然后,当我添加第二个文档时,侦听器将获取所有两个文档,而不仅仅是最新的文档,而且我的recyclerView看起来像这样

enter image description here

2 个答案:

答案 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