【问题标题】:Room Database Get last chat message when loading chats房间数据库在加载聊天时获取最后的聊天消息
【发布时间】:2021-02-07 20:19:59
【问题描述】:

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

我有两张桌子

Contact
   - contact_id
   - contact_name
   - about

ChatMessage
   - contact_id
   - content
   - received_at

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

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

1.获取所有聊天消息

2.按contact_id与最近聊天分组

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

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

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

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

任何帮助将不胜感激

【问题讨论】:

    标签: android sql database sqlite android-room


    【解决方案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();
    

    【讨论】:

    • 不应该是 GROUP BY contact_id 而不是 message_id 吗?
    • “ON cm_last.message_id = cm.message_id”还不够吗?为什么我们使用“AND cm_last.received_at = cm.received_at”?
    • Shouldn't it be GROUP BY contact_id instead of message_id - 是的,你是对的。更新了我的答案。但是对于cm_last.received_at = cm.received_at,你需要这个才能得到最后一条消息
    • 我得到编译时错误实现,错误:用@Relation 注释的字段必须是列表或集合。
    • 更改依赖项解决了问题。感谢您的宝贵回答?
    猜你喜欢
    • 1970-01-01
    • 2018-10-09
    • 2015-04-08
    • 2017-09-27
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    相关资源
    最近更新 更多