【问题标题】:Why removed event called in firestore realtime Listener when new document added in the collection?为什么在集合中添加新文档时删除了在 Firestore 实时侦听器中调用的事件?
【发布时间】:2023-03-16 19:45:01
【问题描述】:

我正在尝试实时阅读消息,问题是当人 A 向人 B 发送消息时,人 B 实时侦听器调用了一个已添加的事件,这完全是我明白的,但为什么删除事件也叫什么?

 fun readMessagesRealTimeListener(documentID: String, date: Date, senderUser: ChatUser, reciverUser: ChatUser): LiveData<List<ChatMessage>> {
        if (mutableChatMessageList == null) {
            mutableChatMessageList = MutableLiveData()
            val chatMessageList = ArrayList<ChatMessage>()
            db = FirebaseFirestore.getInstance()
            readMessageListener = db.collection(Constants.CONVERSATION)
                    .document(documentID)
                    .collection("0")
                    .orderBy("data", Query.Direction.DESCENDING)
                    .limit(5)
                    .addSnapshotListener(EventListener<QuerySnapshot> { querySnapshot, e ->
                        if (e != null) {
                            Log.d(TAG, "error in real time listerner: " + e.code);
                        }
                        val source = if (querySnapshot != null && querySnapshot.metadata.hasPendingWrites())
                            "Local"
                        else
                            "Server"
                        Log.d(TAG, "source of $source")
                        chatMessageList.clear()
                        if (!querySnapshot?.isEmpty!!) {
                            for (changedSnapshot in querySnapshot.documentChanges) {
                                when (changedSnapshot.type) {
                                    DocumentChange.Type.ADDED -> Log.d(TAG, "New message: " + changedSnapshot.getDocument().getData())
                                    DocumentChange.Type.MODIFIED -> Log.d(TAG, "Modified message: " + changedSnapshot.getDocument().getData())
                                    DocumentChange.Type.REMOVED -> Log.d(TAG, "Removed message: " + changedSnapshot.getDocument().getData())//this log also called when new document added in firestore but why?
                                }

                                var chatMessage = changedSnapshot.document.toObject(ChatMessage::class.java)

                                Log.d(TAG, "message " + chatMessage.message)
                                chatMessageList.add(chatMessage)

                            }
                            mutableChatMessageList?.value = chatMessageList
                        } else {
                            Log.d(TAG, "no message found in real time")
                            mutableChatMessageList?.setValue(null)
                        }
                    })
        }

        return mutableChatMessageList!!
    }

【问题讨论】:

    标签: android firebase kotlin google-cloud-firestore


    【解决方案1】:

    快速猜测是您的集合中有超过 5 条消息。在这种情况下,此侦听器仅显示最新的 5 条消息:

    readMessageListener = db.collection(Constants.CONVERSATION)
            .document(documentID)
            .collection("0")
            .orderBy("data", Query.Direction.DESCENDING)
            .limit(5)
    

    因此,现在当您添加新消息时,该新消息将成为最新消息。并且之前的第一条消息从QuerySnapshot中删除。

    最容易看出我们是否能快速拟定消息。假设你从这 5 个开始:

    1
    2
    3
    4
    5
    

    因此,您的侦听器会被这 5 条消息调用。现在我们添加一条新消息6。此新消息将添加到QuerySnapshot。但这将导致它有 6 条消息,而您只要求 5 条消息。因此,您会得到一个 ADDED 对应 6,以及一个 REMOVED 对应 `1。

    1 REMOVED
    2
    3
    4
    5
    6 ADDED
    

    最终得到:

    2
    3
    4
    5
    6
    

    【讨论】:

    • 我认为这个删除操作不会让我花钱,因为它发生在 clinte 方面,对吗?
    • 如果没有在服务器上/从服务器上读取REMOVED 的文档(至少是最常见的情况),那么它确实是一次不收费的读取。
    • 该死的,我喜欢 Stack Overflow。一些最聪明的人
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2013-06-27
    • 2020-01-05
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2018-05-21
    相关资源
    最近更新 更多