android - 删除元素时触发 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();
解决方案
您的查询是说“给我按 SEND_TIME 排序的前 20 个文档”:
chatListener = db.collection(ALL_CHAT)
.orderBy(SEND_TIME, Query.Direction.DESCENDING)
.limit(20)
当您将侦听器附加到它时,每次前 20 名中的任何文档随时间变化时都会调用该侦听器。
当您从前 20 个文档中删除一个文档时,您的侦听器将收到一个回调,告诉您哪个文档被删除。而且,由于您的查询总是想要前 20 名,因此将再次调用侦听器以告诉您另一个文档现在是前 20 名的一部分(之前位于第 21 位)。这将显示为“添加”文档。
因此,您的听众正在按预期工作。您的听众应该随时准备好处理前 20 个文档的任何更改。
推荐阅读
- javascript - JavaScript .animate() 在 Iphone6 上不起作用
- java - 反应式流与线程池有何不同?
- scala - 在 Spark DataFrame 列中获取不同的单词
- javascript - 使用 react-csv 进行 API 调用
- c# - Unity Muzzleflash 将不断循环播放,尽管没有循环播放。不知道如何解决
- r - 如何提取始终在特定字符串之前的值
- python - BeautifulSoup 断链检查器/网络爬虫
- python - 8080 端口没有监听 Gunicorn HTTP 服务器
- r - 如何使用 rlang 动词对函数内的数据进行子集化?
- node.js - 如何用es在express js中导入导出函数