Firestore聊天消息的顺序不正确?

问题描述

因此,我仍然是Firebase的新手,我只是从Firebase实时数据库切换到Firestore。 到目前为止,效果很好。 但是我的聊天应用中的消息有问题。 使用Firebase实时数据库,一切工作正常,但是使用Firestore则存在一些问题。我可以发送和显示消息,但是Firestore以某种方式更改了聊天的顺序。有人可以向我解释一下并提出解决方案吗?

该错误的示例视频: https://youtu.be/KE28qK22DoQ

(适配器)MessageAdapter:https://hastebin.com/avoluximow.java

(模型)聊天:https://hastebin.com/secuvojoyu.java

这是我用于写入和读取数据的代码:

private void sendMessage(String sender,String receiver,String message) {
    FirebaseFirestore db = FirebaseFirestore.getInstance();

    HashMap<String,Object> chat = new HashMap<>();
    chat.put("sender",sender);
    chat.put("receiver",receiver);
    chat.put("message",message);

    db.collection("chats").add(chat);
}

private void readMessages(final String myid,final String userid) {
    mChat = new ArrayList<>();
    FirebaseFirestore db = FirebaseFirestore.getInstance();

    db.collection("chats")
            .addSnapshotListener(new EventListener<QuerySnapshot>() {
                @Override
                public void onEvent(@Nullable QuerySnapshot value,@Nullable FirebaseFirestoreException e) {
                    if (e != null) {
                        Log.w(TAG,"readMessages - Reading data failed",e);
                        return;
                    }

                    mChat.clear();
                    for (QueryDocumentSnapshot document : value) {
                        Chat chat = document.toObject(Chat.class);
                        if (chat.getReceiver().equals(myid) && chat.getSender().equals(userid) ||
                                chat.getReceiver().equals(userid) && chat.getSender().equals(myid)) {
                            mChat.add(chat);
                        }

                        messageAdapter = new MessageAdapter(MessageActivity.this,mChat);
                        recyclerView.setAdapter(messageAdapter);
                    }
                }
            });
}

解决方法

尝试添加新字段(发送消息时):

chat.put("created",Timestamp.now());

并将字段添加到您的实体Chat.java

private Timestamp created;

public Timestamp getCreated() {
    return created;
}

在创建适配器之前,请按以下字段对列表进行排序:

Chat chat = document.toObject(Chat.class);
if (chat.getReceiver().equals(myid) && chat.getSender().equals(userid) ||
        chat.getReceiver().equals(userid) && chat.getSender().equals(myid)) {
    mChat.add(chat);
}
// sorting by date >
Collections.sort(mChat,new Comparator<Chat>() {
    @Override
    public int compare(Chat o1,Chat o2) {
        return o1.getCreated().compareTo(o2.getCreated());
    }
});
// ^
messageAdapter = new MessageAdapter(MessageActivity.this,mChat);
recyclerView.setAdapter(messageAdapter);

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...