android - 房间数据库在加载聊天时获取最后的聊天消息
问题描述
我正在开发一个聊天应用程序,其中消息保存在离线房间数据库中
我有两张桌子
Contact
- contact_id
- contact_name
- about
ChatMessage
- contact_id
- content
- received_at
在聊天屏幕上,我通过在联系人表上查询来显示最近的聊天但我试图显示最近的聊天,所以更好的方法是查询 ChatMessage 表获取唯一的最近消息并检索联系人信息,如姓名
所以我实施了一个非常糟糕的方法(可能是最糟糕的),其中包括
1.获取所有聊天消息
2.按contact_id与最近聊天分组
3.for循环查询并获取联系人行并将名称附加到主对象列表
4.在回收站视图中显示列表
我想知道是否有更好的方法来做到这一点
我认为关系或连接可以提供帮助,但我不知道它们或它们在房间数据库中的实现
任何帮助将不胜感激
解决方案
检查 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;
}
- 将下一个方法添加到您的 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();
推荐阅读
- javascript - 我有 html 网站文件夹。我必须在 iframe 中动态加载该网站,保持 src 属性为空
- nuget - NuGet PackageManager.InstallPackageAsync() 抛出 NullReferenceException
- azure-ad-b2c - 通过 Azure AD B2C 将第三方 IDP 的访问令牌传递给应用程序
- isabelle - 在归纳规则生成的文本中添加注释
- python - Django 3.X 管理员在新导航栏中显示所有模型
- java - 传统的 Websphere docker - 将 XML 复制到节点
- mongodb - 根据操作系统(Windows 或 macOS)更改 docker-compose 中的卷路径
- docker - 如何从图层和清单创建 docker 映像?组装成图像后,如何从中生成容器?
- python - 两个数据帧之间的条件格式,在第二个数据帧中,如果条件对第一个数据帧有效,我想备注为真
- cmake - CMake子目录包含问题