我正在开发一个聊天应用程序,其中消息被保存在离线会议室数据库中
我有两个桌子
Contact
- contact_id
- contact_name
- about
ChatMessage
- contact_id
- content
- received_at
在聊天屏幕上,我通过在联系人表上查询来显示最近的聊天 但是我试图显示最近的聊天,所以更好的方法是查询ChatMessage表以获得唯一的最近消息,并检索姓名之类的联系信息
所以我实施了一种非常糟糕的方法(可能是最糟糕的方法),其中包括
1。获取所有聊天消息
2。按contact_id与最近的聊天分组
3。在for循环查询中,获取联系人行并将名称附加到主要对象列表中
4。在回收站视图中显示列表
我想知道是否还有更好的方法
我认为关系或联接可以提供帮助,但是我不知道它们或它们在房间DB中的实现
任何帮助将不胜感激
答案 0 :(得分:1)
检查Java中的下一种方法(但Kotlin的想法相同)
message_id
(主键)添加到您的ChatMessage
实体中。Contact
和ChatMessage
实体外,还增加了一个类LastMessages
(不是实体,只是POJO):public class LastMessage {
@Embedded
public ChatMessage lastMessage;
@Relation(
parentColumn = "contact_id",
entityColumn = "contact_id"
)
public Contact contact;
}
@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();