Core Data 中的排序顺序具有多重关系

Posted

技术标签:

【中文标题】Core Data 中的排序顺序具有多重关系【英文标题】:Sort order in Core Data with a multi-multi relationship 【发布时间】:2010-12-21 21:43:03 【问题描述】:

假设我正在为一所学校建模,所以我有 2 个实体:学生和班级。无论出于何种原因,我希望每个班级名册都有一个自定义的排序顺序。在一个简单的关系中,这意味着给 Student 一个 sortOrder 属性,然后只按这个数字对列表进行排序。问题是,学生可能在一个班级中订购 3,而在另一个班级订购 6。我如何将这些排序存储在 Core Data 中,以便我可以轻松访问它们并对我的列表进行正确排序?

 Student                  Class
 classes  <<--------->>  students
    ^                       ^
    |                       |
unordered                ordered

这张图可能有助于解释我想要做什么。我希望以存储在某处的特定顺序获取学生“名册”,该顺序可以是任何顺序。存储此顺序是我不确定如何以最有效的方式进行的操作。创建一堆 Order 对象并尝试管理链接听起来开销很大,感觉必须有更好的方法。

【问题讨论】:

【参考方案1】:

如果学生的排序可以由一个或多个NSSortDescriptors 描述,您可以在Class 实体上创建一个fetched 属性,用于获取学生并应用排序描述符。或者,将排序描述符应用于您用来处理班级学生集合的NSFetchedResultsController 可能更容易(取决于您的用例)。

如果您不能使用NSSortDescriptor,那么您需要Student 实体上的index 属性(或您选择的名称)如果只有一个排序或Order 实体的集合描述每个Student 的每个排序中的索引。您将负责维护这些索引值。不幸的是,在 Core Data 中没有简单的方法可以做到这一点。这只是很多工作。

【讨论】:

问题是不能用描述符来描述,因为排序是任意的,用户可以自定义。一旦我能够存储这个顺序,那么我应该能够使用排序描述符对结果进行排序。【参考方案2】:

学生 > StudentClass > 班级

StudentClass
----
studentID
order
classID 

然后您可以根据需要进行选择。

例如,您有一个student。获取 StudentID 为 student.studentID 的所有 StudentClass。然后,您就拥有了 order 以及对 Class 的访问权限。

您可能希望添加一些业务逻辑以使您的生活更轻松。另外,如果您还没有使用它,请查看 MOGenerator:https://github.com/rentzsch/mogenerator

编辑:我真的很想知道为什么这会被否决。评论将不胜感激。

【讨论】:

ID 不会根据上下文是否保存而改变吗? studentID 是核心数据 ID 字符串的关系还是属性? 另外,MOGenerator 看起来很酷,但我的项目不是用它构建的。当我尝试在我的 Student 子类中引用 _Student 类时抱怨元类。 抱歉,我应该更具体一些。 studentID 和 classID 将是 you 将设置的变量(这明显不同于“正常”情况下的主键),并且不依赖于底层 SQL 引擎来执行此操作。但是,您需要保证各个表的唯一标识符。

以上是关于Core Data 中的排序顺序具有多重关系的主要内容,如果未能解决你的问题,请参考以下文章

iOS 5/Lion Core Data 有序关系:指定顺序?

如何在 Core Data 中设置一对多关系的排序?

Core Data 根据是不是存在关系对描述符进行排序?

Core Data 后台排序

如何获取 Core Data 中的关系项属性?

iOS 使用关系检索和排序 Core Data 实体