java - 如何在没有此问题的情况下有效地在Firestore聊天应用程序中存储或检索消息?

标签 java android google-cloud-firestore

我的问题是,Firestore数据库中的现有数据会更新,而不是添加新数据。这导致显示在ChatActivity中发送或接收的最后一条消息。同样,我发送的消息在发送后在屏幕上出现两次,但是一旦我离开 Activity 并再次打开它(如我刚才所述),则仅显示在ChatActivity中发送或接收的最后一条消息。在Internet上进行大量搜索并独自测试了各种替代方法之后,仍未能解决此问题之后,我现在向该社区寻求帮助。

我在下面发布了用于将消息从应用程序发送到数据库的方法以及随后显示这些消息的方法。

发送消息的方法

private void sendMessage(String sender,String receiver,String message){
        DocumentReference documentReference = rootRef.collection("chats").document(roomId).collection("messages").document(roomId);
        Map<String,Object> user = new HashMap<>();
        user.put("sender",sender);
        user.put("receiver",receiver);
        user.put("message",message);
        user.put("time", FieldValue.serverTimestamp());
        user.put("rid",roomId);
        documentReference.set(user,SetOptions.merge()).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Log.d(TAG, "onSuccess: MessageSent "+ userId);
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.d(TAG, "onSuccess: Error"+ userId);
            }
        });
    }

获取消息方法
private void readMessages(final String userId, final String recipientId){
    mchat = new ArrayList<>();
    CollectionReference collectionReference = rootRef.collection("chats").document(roomId).collection("messages");
    collectionReference.orderBy("time", Query.Direction.DESCENDING);
    collectionReference.addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(@Nullable QuerySnapshot documentSnapshots, @Nullable FirebaseFirestoreException e) {
            if (e != null) {
                Log.e(TAG, "onEvent: Listen failed.", e);
                return;
            }
            if(documentSnapshots!=null){
                for(QueryDocumentSnapshot queryDocumentSnapshots : documentSnapshots){
                    Chat chat = queryDocumentSnapshots.toObject(Chat.class);
                    if(chat.getReceiver().equals(recipientId)&&chat.getSender().equals(userId)||
                    chat.getReceiver().equals(userId)&&chat.getSender().equals(recipientId)){
                        mchat.add(chat);
                    }
                    messageAdapter = new MessageAdapter(MessageActivity.this,mchat);
                    recyclerView.setAdapter(messageAdapter);
                }
            }
        }
    });
}

最佳答案

我认为由于以下原因,新消息将覆盖旧消息:

DocumentReference documentReference = rootRef.collection("chats").document(roomId).collection("messages").document(roomId);

我相信您需要使最后一个.document()调用具有除roomId以外的其他值,因为如果roomId保持不变,则同一消息集合中将永远不会有多个消息。也许将roomId更改为messageId。

对于阅读问题,请参见@Frank van Puffelen答案

关于java - 如何在没有此问题的情况下有效地在Firestore聊天应用程序中存储或检索消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59602344/

相关文章:

Android 浏览器滚动问题

java - 如何使用百分比和消息而不是弃用的 ProgressDialog 创建自定义 progressDialog

swift - "FIRESTORE INTERNAL ASSERTION FAILED: Invalid document reference. Document references must have an even number of segments, but NewGame has 1"

firebase - 获取具有等于特定字符串的字段的 Firestore 文档

java - Java FX 中的抗锯齿管理

java - mysql实时数据消耗

java - mvn package命令抛出 "error 401 Unauthorized "

java - 对字符串日期进行排序并对其进行排序

Android gson 流解析器或 android.util.jsonreader?

firebase - 在查询中使用 orderBy 和 startAfterDocument 时出错