核心数据:以一对多关系存储有序值

Posted

技术标签:

【中文标题】核心数据:以一对多关系存储有序值【英文标题】:Core Data: storing ordered values in a one-to-many relationship 【发布时间】:2021-10-31 14:43:03 【问题描述】:

我正在构建一个锻炼应用程序,该应用程序具有一个名为 Workout 的实体和另一个名为 Exercise。 一个锻炼可以包含多个锻炼(因此是一对多的关系)。我想以有序的方式向我的应用程序的用户展示锻炼中包含的练习(从力量练习开始与有氧运动开始不同)。

显然,在 Core Data 中建立这种关系时,我需要使用NSSet,因为如果我尝试使用例如其中元素排序的Array,我会收到以下错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for to-many relationship: property = "consistsOf"; desired type = NSSet; given type = __NSArray0; value = (
).'

我尝试检查模型中的“已订购”复选标记,但随后出现错误提示“不得订购 Workout.consistsOf”。 我还尝试使用NSDictionary,其键是位置,值是练习本身,但我遇到了与上述相同的错误。

如何以有序的方式向用户展示锻炼所包含的练习?

提前非常感谢!

P.S.:这是我的模型属性的截图。

【问题讨论】:

我认为检查“ordered”会使Core Data使用NSOrderedSet 确实如此,在将我的属性转换为NSORderedSet 后,我仍然得到:Workout.consistsOf must not be ordered [8]。我也意识到错误的标题是CloudKit integration 好吧,那就是另一种情况了。我不是 CloudKit 专家,因为我刚开始使用它,但它肯定会影响(增加更多约束)你可以使用 Core Data 做什么。当然,另一种选择是将您自己的订单属性添加到练习中。 恐怕这是 CloudKit 不支持 (NS)OrderedSet 映射的小问题之一 - 至少这是我在去年遇到同样问题时发现的:-/。大多数人似乎正在通过向需要排序的实体添加一个额外的优先级属性来解决这个限制(而不是像链表或类似的更复杂的东西)。 这里有更多确认以前的评论和对替代方法的建议appsdissected.com/order-core-data-entities-maximum-speed 【参考方案1】:

有序关系使用NSOrderedSet,但CloudKit不支持有序集合,所以不能在同一个数据模型中使用有序关系和CloudKit。

要保持订单,您需要在Exercise 上拥有一些属性来指示订单。这可以像index 之类的整数属性一样简单。您将根据索引值对结果进行排序。如果还有其他指示顺序的东西——比如日期,也许?——使用它而不是添加新属性。

【讨论】:

感谢您的信息!我最终创建了一个中间表,在锻炼中添加了锻炼顺序

以上是关于核心数据:以一对多关系存储有序值的主要内容,如果未能解决你的问题,请参考以下文章

核心数据以一对多关系排序

核心数据一对多关系不存储其数据

核心数据以一对多关系保存在后台

用于核心数据一对多关系的 NSSortDescriptor

核心数据 - 将数组存储到核心数据中 一对多关系表

核心数据:以一对多的关系获取实体的获取请求