CoreData对多对多关系进行排序

wom*_*t57 13 iphone cocoa-touch core-data nssortdescriptor ios

我正在编写一个iOS应用程序,它具有人员记录存储,并且需要显示以特定方式排序的列表.这些排序有可变数量,它们是动态生成的,但我希望它们存储在数据存储区中.执行此操作的SQL方法是使ListPositions表具有列表名称,人员表中的id和排序键.然后,为了显示特定列表,我可以选择具有给定名称的所有列表ListPosition,拉入引用的人员,并对排序键进行排序.尝试在CoreDatat中执行此操作,但是我遇到了问题.我试图使用如下架构来做到这一点:

Person:
    Name
    DOB
    etc... 
    positions -->> ListPosition

ListPosition:
    listName
    sortKey
    person --> Person
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用NSPredicate获取给定列表中的所有人员 [NSPredicate predicateWithFormat:@"ANY positions.listName like %@", someList]; 这允许我针对大量人员动态添加列表.问题是我无法使用ListPosition的sortKey字段对Persons进行排序.NSSortDescriptor会做什么?如果无法对多对多关系的一个元素的属性进行获取,那么在coredata中获取多个动态排序的另一种方法是什么?我正在使用NSFetchedResultsController显示列表,因此我无法将这些列表放在内存中.我需要使用单个NSFetchRequest来完成它.

Tom*_*ton 6

你是对的——遵循一对多的关系会返回一个 NSSet,它没有固有的排序。要获得排序结果,有几个选项:

  1. 假设 Person/ListPosition 是双向关系,对 ListPosition 实体执行新的 fetch 请求。在 ListPosition 中的“person”关系上进行谓词匹配,看起来像[NSPredicate predicateWithFormat:@"person=%@", myPerson]. 在获取请求中使用您需要的任何排序描述符。
  2. 按照你正在做的关系,这会给你一个 NSSet。然后使用 NSSet 的-sortedArrayUsingDescriptors:方法将其转换为排序数组。