gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:47:25 24 4
gpt4 key购买 nike

我的问题是,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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com