根据实体类对 NSFetchRequest 进行排序

Posted

技术标签:

【中文标题】根据实体类对 NSFetchRequest 进行排序【英文标题】:Sorting a NSFetchRequest based on entity class 【发布时间】:2014-01-08 22:38:36 【问题描述】:

我正在使用 CoreData 并且有两个子实体和一个共同的抽象超实体,我们称它们为

SuperEntity,
FirstSubEntity and
SecondSubEntity

所有三个实体都有自己的NSManagedObjectSuperEntity 子类。

我使用NSFetchRequest 来获取SuperEntity 类型的所有对象,这意味着我将得到一组所有FirstSubEntitiesSecondSubEntities 都混在一起的对象。我想根据实体类对这个集合进行排序,像这样。

<FirstSubEntity id=X> <FirstSubEntity id=X> <FirstSubEntity id=X> ... <SecondSubEntity id=X> <SecondSubEntity id=X> ...

我正在尝试使用键 class 设置 NSSortDescriptor

[NSSortDescriptor sortDescriptorWithKey:@"class" ascending:YES]

不幸的是它抛出了一个异常

'NSInvalidArgumentException', reason: 'keypath class not found in entity <NSSQLEntity SuperEntity id=X>'

奇怪的是,如果我改用 NSFetchedResultsController,我可以像这样将 sectionName 设置为 class

[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:[RKManagedObjectStore defaultStore].mainQueueManagedObjectContext
                                      sectionNameKeyPath:@"class"
                                                acheName:nil];

效果很好。有关如何使用NSSortDescriptors 管理此问题的任何想法?

【问题讨论】:

【参考方案1】:

这在sectionNameKeyPath 中有效,因为sectionNameKeyPath 在对象加载到内存后被解析。 NSFetchRequest 及其排序描述符是在 SQLite 级别完成的,键 class 没有意义。

此外,在 SQL 级别,您的两个实体实际上位于同一个表中,因此无法区分并因此在此时对它们进行排序。

您唯一的解决方案是在内存中对它们进行排序,而不是直接在 fetch 中。您可以使用NSSortDescriptor 来处理来自正常获取请求的返回数组,在这种情况下,我将使用entity.name 而不是class

【讨论】:

'它不再适用于 ios 10:'NSInvalidArgumentException',原因:'keypath entity.name not found in entity '' Markus,是否仍然可以按实体名称排序结果?你有解决办法吗?

以上是关于根据实体类对 NSFetchRequest 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchRequest 分组并按 dateField 计数

NSFetchRequest 按月分组

iOS - NSFetchRequest:对字符串长度进行排序

是否可以在 NSPredicate 中为 NSFetchRequest 使用父实体的属性?

NSFetchRequest 带有用于递归 CoreData 实体关系的排序描述符

NSFetchRequest 还获取我的实体类型的子类