根据实体类对 NSFetchRequest 进行排序
Posted
技术标签:
【中文标题】根据实体类对 NSFetchRequest 进行排序【英文标题】:Sorting a NSFetchRequest based on entity class 【发布时间】:2014-01-08 22:38:36 【问题描述】:我正在使用 CoreData 并且有两个子实体和一个共同的抽象超实体,我们称它们为
SuperEntity,
FirstSubEntity and
SecondSubEntity
所有三个实体都有自己的NSManagedObject
或SuperEntity
子类。
我使用NSFetchRequest
来获取SuperEntity
类型的所有对象,这意味着我将得到一组所有FirstSubEntities
和SecondSubEntities
都混在一起的对象。我想根据实体类对这个集合进行排序,像这样。
<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以上是关于根据实体类对 NSFetchRequest 进行排序的主要内容,如果未能解决你的问题,请参考以下文章
NSFetchRequest 分组并按 dateField 计数
iOS - NSFetchRequest:对字符串长度进行排序
是否可以在 NSPredicate 中为 NSFetchRequest 使用父实体的属性?