会议室数据库加载聊天室时获取最后的聊天室消息

时间:2020-10-25 10:08:38

标签: android sql database sqlite android-room

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

我有两个桌子

Contact
   - contact_id
   - contact_name
   - about

ChatMessage
   - contact_id
   - content
   - received_at

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

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

1。获取所有聊天消息

2。按contact_id与最近的聊天分组

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

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

我想知道是否还有更好的方法

我认为关系或联接可以提供帮助,但是我不知道它们或它们在房间DB中的实现

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

检查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();