在核心数据中有效地获取一对多关系中的最新记录
Fetch newest record in to-many relationship efficiently in Core Data
我在 Channel
和 Message
之间有一对多的关系,即一个频道可以有多个消息,一个消息只属于一个频道。我想有效地获取最后一条消息和频道。请注意,一个频道可能会包含大量消息。我可以想到几个不同的选择:
- 使消息成为 Channel 上的有序关系并获取最后一条消息(在 Swift 中使用 messages.last)
潜在问题:根据我有限的经验,可能会涉及一些类型转换,因为
NSOrderedSet
不像 Set 那样支持泛型。我还读到 Core Data 中有序关系的组合,Xcode 和 Swift 通常有一些怪癖,所以不确定。
- 使消息成为 Channel 上的无序关系,并使用 Message 上的获取请求获取最后一条消息(按时间戳 desc 排序)
潜在问题:每次访问最后一条消息时都需要获取请求,这可能是一个潜在的性能问题。
- 在 Channel 上添加一个名为 lastMessage 的附加一对一关系,并始终保持更新。然后,使用单个获取请求预取 lastMessage 关系以及 Channels。
潜在问题:确保 lastMessage 保持同步的附加代码。
为了进一步扩展这个问题,如果我想获取最后 n 条消息而不是最后一条消息,建议的方法是什么?
非常感谢!
我认为你的选项 2 是最可靠的。您可以使用一些技巧来确保高效抓取,因此我认为您不会 运行 遇到任何性能问题。
方案三也是可行的,也不费力。只需在设置频道时执行 didSet
即可。但是,它不是那么干净,对您的 "n last messages" 问题没有帮助。
按日期排序抓取真的很高效。诀窍是在获取请求上设置适当的排序描述符,然后将 fetchLimit
设置为 n
,如果您要查找最后一条消息,则设置为 1
。
确保检查 "not found" 或 "found less than n" 错误情况并适当处理它们。
我在 Channel
和 Message
之间有一对多的关系,即一个频道可以有多个消息,一个消息只属于一个频道。我想有效地获取最后一条消息和频道。请注意,一个频道可能会包含大量消息。我可以想到几个不同的选择:
- 使消息成为 Channel 上的有序关系并获取最后一条消息(在 Swift 中使用 messages.last)
潜在问题:根据我有限的经验,可能会涉及一些类型转换,因为
NSOrderedSet
不像 Set 那样支持泛型。我还读到 Core Data 中有序关系的组合,Xcode 和 Swift 通常有一些怪癖,所以不确定。 - 使消息成为 Channel 上的无序关系,并使用 Message 上的获取请求获取最后一条消息(按时间戳 desc 排序) 潜在问题:每次访问最后一条消息时都需要获取请求,这可能是一个潜在的性能问题。
- 在 Channel 上添加一个名为 lastMessage 的附加一对一关系,并始终保持更新。然后,使用单个获取请求预取 lastMessage 关系以及 Channels。 潜在问题:确保 lastMessage 保持同步的附加代码。
为了进一步扩展这个问题,如果我想获取最后 n 条消息而不是最后一条消息,建议的方法是什么?
非常感谢!
我认为你的选项 2 是最可靠的。您可以使用一些技巧来确保高效抓取,因此我认为您不会 运行 遇到任何性能问题。
方案三也是可行的,也不费力。只需在设置频道时执行 didSet
即可。但是,它不是那么干净,对您的 "n last messages" 问题没有帮助。
按日期排序抓取真的很高效。诀窍是在获取请求上设置适当的排序描述符,然后将 fetchLimit
设置为 n
,如果您要查找最后一条消息,则设置为 1
。
确保检查 "not found" 或 "found less than n" 错误情况并适当处理它们。