android - 如何获取最新的关系项而不是 Android Room 中的列表
问题描述
我的结构如下:
包含一个或多个消息的对话。对话和消息都在各自的表格中。我创建了一个 ConversationDetailed 关系 POJO,将 Conversation 与其消息列表合并。
public class ConversationDetailed {
@Embedded
public Conversation conversation;
@Relation(
parentColumn = "id",
entityColumn = "conversation_id",
entity = Message.class
)
public List<Message> messageList;
}
到目前为止,这按预期工作,没有发现任何问题。现在我正在尝试创建一个 ConversationSummary 关系,其中只有属于该对话的最新消息,我无法在任何地方找到如何执行此操作的示例。这就是我想要实现的目标:
public class ConversationSummary {
@Embedded
public Conversation conversation;
@Relation(
parentColumn = "id",
entityColumn = "conversation_id",
entity = Message.class
)
public Message recentMessage; // <- the most recent message of this conversation
}
我知道我可以使用 ConversationDetailed 并从列表中选择最新的消息,但这意味着无需任何必要就可以从数据库中查询很多消息,而我想要的只是最新消息。
如何使用上面示例中的关系 POJO 来实现这一点?
编辑:在尝试了另一个用户建议的初始答案后,我发现关系是单独的查询,这就是使用关系 POJO 的查询使用事务的原因,因此问题仍未得到解答。有没有办法指定关系项的顺序?
EDIT2:在提供第一个答案的同一用户详细解释后,我终于能够完成这项工作。这是适用于我的案例的基本原理。
MAX 与 JOIN 的组合允许我选择从所有消息中选择具有最新消息的对话,包括与该消息无关的所有对话。为对话 id 添加 GROUP BY 拆分上述逻辑以获得每个唯一对话 id 的 MAX。之后就是将 ORDER BY 应用于消息创建日期的问题。
@Query(
"SELECT " +
"*, MAX(Message.date)" +
"FROM Conversation " +
"JOIN Message " +
"ON Conversation.id = Message.conversation_id " +
"GROUP BY Conversation.id " +
"ORDER BY Message.date DESC "
)
abstract List<ConversationSummary> getSummaryList();
解决方案
尝试下一个解决方法(因为我不知道直接的方法来做你想做的事Relations
):
- 编写查询以获取对话中的所有最近消息。假设您有一些字段
posted
可用于定义消息是最近的(换句话说,您应该找到与 maxal 的详细对话posted
)。 - 用于
Room Relations
将Conversation
实体附加到查询的结果。
因此,附加类(查询应返回该类值的列表):
public class RecentMessage {
@Embedded
public Message recentMessage;
@Relation(
parentColumn = "conversation_id",
entityColumn = "id"
)
public Conversation conversation;
}
并查询:
SELECT * FROM conversation_detailed as table1 JOIN (select conversation_id, max(posted) as posted from conversation_detailed) as table2 on table1.conversation_id=table2.conversation_id and table1.posted = table2.posted
推荐阅读
- dart - 我无法在颤动中对特定的 url 进行 REST api 调用
- fortran - 如何知道 Fortran 中带有尾随空格的用户输入的长度?
- javascript - 代码只在第一次运行良好,之后它崩溃(DOM)
- c - 自动完成 unix 函数原型
- c# - 如何将文件动态添加到存储在 Azure Blob 存储中的 zip 存档?
- python - 找到我的鼠标位置。帮我
- java - 将 JSTL jar 包安装到 JSP 项目中
- google-maps - 谷歌街景是黑暗的(即使在官方服务网址上)
- javascript - 使 fontFamily cssproperty 单引号
- oracle - TNS的优势是什么?