定制订购Core Data to-many关系?

时间:2017-08-31 11:27:40

标签: core-data

如何按照自定义'进行排序?在多对多关系中订购托管对象?似乎托管对象是以任意顺序排列的,我需要按name属性按字母顺序排序。我应该扩展托管对象/实体吗?

enter image description here

2 个答案:

答案 0 :(得分:0)

该关系被定义为一个无序的集合。您可以将该集转换为数组,然后对该数组进行排序:

NSArray* sortedEvents = [user.events.allObjects sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]]

答案 1 :(得分:0)

是的,Core Data中的托管对象没有特别的顺序。您可以通过在获取请求上设置sortDescriptors属性来获取时对它们进行排序。如果您已经在进行提取,那么比首先获取然后在内存中进行排序更快更有效,例如,通过调用sortedArrayUsingDescriptors

因此,如果您要获取所有事件,您将执行以下操作:

let fetchRequest: NSFetchRequest<Event> = Event.fetchRequest()
fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(Event.name),
                                                 ascending: true)]

或者,如果您有一个名为usersWhoLiked的从事件到用户的多对多关系,您可以获取至少一个50岁以上用户喜欢的所有事件,如下所示:

let fetchRequest: NSFetchRequest<Event> = Event.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "@"SUBQUERY(usersWhoLiked, $user, $user.age > %d).@count != 0",
                50))
fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(Event.name),
                                                 ascending: true)]

但请注意,sortDescriptors仅适用于获取请求的实体。而且,如果您根本没有进行提取,例如只是订购特定用户的所有事件,那么Jon Rose的解决方案可能同样有效或更高。

目前还不清楚您想要订购什么。我希望这能回答你的问题。