获取已排序记录的问题 (CoreData)

Posted

技术标签:

【中文标题】获取已排序记录的问题 (CoreData)【英文标题】:Issue with fetching sorted records (CoreData) 【发布时间】:2014-12-31 09:02:18 【问题描述】:

我有

两个实体记录和分组。

一对多的关系,所以每个组可以有多个记录。

在群组中 -> (relationship:arrRecord, Destination:record, Inverse:recordGroup)

记录中 -> (relationship:recordGroup, Destination:group, Inverse:arrRecord)

我能够获取组和相应的记录。但我无法获取按记录字段“名称”排序的组和相应记录。

代码:

let fetch: NSFetchRequest  = NSFetchRequest(entityName: "group")
if let fetchGroups = APP_DELEGATE.managedObjectContext!.executeFetchRequest(fetch, error: nil) as? [group]

 for group in fetchGroups
  

    let sortDesc = NSSortDescriptor(key: "name", ascending: true)
    let arrSorted = group.arrRecord.sortedArrayUsingDescriptors([sortDesc])
    print("arrSorted === \(arrSorted)") // sorted by name

    group.arrRecord = NSSet(array: arrSorted)
    print("NSSet(array: group.arrRecord) === \(group.arrRecord)") //not sorted by name

  

arrSorted 正在排序,但是当转换回 NSSet 时,订单重置:(

【问题讨论】:

如果您将数组重新分配给一个集合,那么它会再次未排序。这就是集合的工作方式,它是无序的/无序的。只需使用排序后的数组即可。 集合按定义是未排序的,因此当您将结果分配给集合时,您将总是有一个未排序的集合。 【参考方案1】:

“To Many”关系导致NSSet(或NSOrderedSet,如果您已选中“ordered”),这不是一个排序集合。

您可以使用- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors 来获得已排序的NSArray

【讨论】:

集合未排序,并且您的托管对象关系未定义为已排序,因此一旦将其分配回集合,您将看不到排序。只使用数组有什么问题?你想对排序后的信息做什么?

以上是关于获取已排序记录的问题 (CoreData)的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 后台排序

NSPredicate 在 CoreData 中按字母顺序获取记录

如何在 GROUP BY 之前对 Core Data 记录进行排序?

使用 Core Data 进行排序的 fetchRequest 有啥限制?

Swift 3.1 Coredata 按字母升序排序,但保留以数字开头的记录

iPhone CoreData:使用变音符号排序