首页 > 解决方案 > 删除元素时触发 Firestore 快照侦听器

问题描述

我的 Firebase 聊天应用程序有问题。对于数据库部分,我使用的是 Firestore 云。问题是每次我从数据库中删除一条消息时,消息监听器都会触发两次:

这是我的快照侦听器代码:

chatListener = db.collection(ALL_CHAT)
                .orderBy(SEND_TIME, Query.Direction.DESCENDING)
                .limit(20)
                .addSnapshotListener((messagesDocumentSnapshot, e) -> {
                    if (!messagesDocumentSnapshot.getDocumentChanges().isEmpty()) {
                        List<Message> messages = new ArrayList<>();
                        messagesDocumentSnapshot.getDocumentChanges().forEach(documentChange -> {
                            if (documentChange.getType() == DocumentChange.Type.ADDED) {
                                Message message = documentChange.getDocument().toObject(Message.class);
                                message.setId(documentChange.getDocument().getId());       
                                messages.add(message);
                            }
                        });

                        if (!messages.isEmpty()) {
                            Collections.reverse(messages);
                            allChatFragment.updateMessages(messages, POSITION_END);
                        }
                    }
                });

这是删除的代码:

db.collection(ALL_CHAT)
                .document(id)
                .delete();

标签: androiddatabasefirebasegoogle-cloud-firestore

解决方案


您的查询是说“给我按 SEND_TIME 排序的前 20 个文档”:

chatListener = db.collection(ALL_CHAT)
                .orderBy(SEND_TIME, Query.Direction.DESCENDING)
                .limit(20)

当您将侦听器附加到它时,每次前 20 名中的任何文档随时间变化时都会调用该侦听器。

当您从前 20 个文档中删除一个文档时,您的侦听器将收到一个回调,告诉您哪个文档被删除。而且,由于您的查询总是想要前 20 名,因此将再次调用侦听器以告诉您另一个文档现在是前 20 名的一部分(之前位于第 21 位)。这将显示为“添加”文档。

因此,您的听众正在按预期工作。您的听众应该随时准备好处理前 20 个文档的任何更改。


推荐阅读