首页 > 解决方案 > 房间数据库在加载聊天时获取最后的聊天消息

问题描述

我正在开发一个聊天应用程序,其中消息保存在离线房间数据库中

我有两张桌子

Contact
   - contact_id
   - contact_name
   - about

ChatMessage
   - contact_id
   - content
   - received_at

在聊天屏幕上,我通过在联系人表上查询来显示最近的聊天但我试图显示最近的聊天,所以更好的方法是查询 ChatMessage 表获取唯一的最近消息并检索联系人信息,如姓名

所以我实施了一个非常糟糕的方法(可能是最糟糕的),其中包括

1.获取所有聊天消息

2.按contact_id与最近聊天分组

3.for循环查询并获取联系人行并将名称附加到主对象列表

4.在回收站视图中显示列表

我想知道是否有更好的方法来做到这一点

我认为关系或连接可以提供帮助,但我不知道它们或它们在房间数据库中的实现

任何帮助将不胜感激

标签: androidsqldatabasesqliteandroid-room

解决方案


检查 Java 中的下一个方法(但 Kotlin 的想法是相同的):

  1. message_id(主键)添加到您的ChatMessage实体。
  2. 除了ContactChatMessage实体之外,再添加一个类LastMessages(不是实体,只是 POJO):
public class LastMessage {

    @Embedded
    public ChatMessage lastMessage;

    @Relation(
        parentColumn = "contact_id",
        entityColumn = "contact_id"
    )
    public Contact contact; 

}
  1. 将下一个方法添加到您的 dao:
@Transaction
@Query("SELECT * FROM chat_message AS cm JOIN (SELECT contact_id, max(received_at) AS received_at FROM chat_message GROUP BY contact_id) AS cm_last ON cm_last.contact_id = cm.contact_id AND cm_last.received_at = cm.received_at")
public List<LastMessage> getLastMessages();

推荐阅读