在 Core Data 中有效地获取一对多关系中的最新记录

Posted

技术标签:

【中文标题】在 Core Data 中有效地获取一对多关系中的最新记录【英文标题】:Fetch newest record in to-many relationship efficiently in Core Data 【发布时间】:2016-05-23 05:05:54 【问题描述】:

ChannelMessages 之间存在一对多关系,即一个频道可以有多个消息,而一个消息恰好属于一个频道。我想有效地获取最后一条消息以及频道。请注意,一个频道可能包含大量消息。我可以想到几个不同的选择:

    在 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 中有效地获取一对多关系中的最新记录的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 CORE DATA 中的一对多关系

将 Core Data 中的一对多显示为一对一

在 Swift Core Data 中从一对多关系中获取对象

Core Data 获取请求与 NSFetchedResultsController 的一对多关系

如何有效地迭代 NSSet (Objective-C) - Core Data 中的多对多关系表示?

我可以在 Core Data 中获取关系数据吗