在 Core Data 中有效地获取一对多关系中的最新记录
Posted
技术标签:
【中文标题】在 Core Data 中有效地获取一对多关系中的最新记录【英文标题】:Fetch newest record in to-many relationship efficiently in Core Data 【发布时间】:2016-05-23 05:05:54 【问题描述】:Channel
和 Message
s 之间存在一对多关系,即一个频道可以有多个消息,而一个消息恰好属于一个频道。我想有效地获取最后一条消息以及频道。请注意,一个频道可能包含大量消息。我可以想到几个不同的选择:
-
在 Channel 上使消息成为有序关系并获取最后一条消息(在 Swift 中使用 messages.last)
潜在问题:根据我有限的经验,由于
NSOrderedSet
不像 Set 那样支持泛型,因此可能涉及到一些强制转换。我还读到 Core Data、Xcode 和 Swift 中的有序关系组合通常有一些怪癖,所以不确定。
使消息在 Channel 上成为无序关系,并使用 Message 上的获取请求获取最后一条消息(按时间戳降序排序)
潜在问题:每次访问最后一条消息时都需要一个 fetch 请求,这可能是一个潜在的性能问题。
在 Channel 上添加一个名为 lastMessage 的附加一对一关系并始终保持更新。然后,使用单个 fetch 请求预取 lastMessage 关系以及 Channels。
潜在问题:确保 lastMessage 保持同步的附加代码。
为了进一步扩展这个问题,如果我想获取最后 n 条消息而不是最后一条消息,建议的方法是什么?
非常感谢!
【问题讨论】:
【参考方案1】:我认为您的选项 2 是最可靠的选项。您可以使用一些技巧来确保有效获取,因此我认为您不会遇到任何性能问题。
选项 3 也是可行的,也不费力。设置频道时只需执行didSet
。但是,它不那么干净,对您的“最后一条消息”问题没有帮助。
按日期排序的获取非常有效。诀窍是在获取请求上设置适当的排序描述符,然后将fetchLimit
设置为n
,或者如果您正在查找最后一条消息,则设置为1
。
确保检查“未找到”或“找到少于 n 个”错误条件并适当处理它们。
【讨论】:
非常感谢您的意见!以上是关于在 Core Data 中有效地获取一对多关系中的最新记录的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift Core Data 中从一对多关系中获取对象
Core Data 获取请求与 NSFetchedResultsController 的一对多关系