【问题标题】:Sorting a NSFetchRequest based on entity class根据实体类对 NSFetchRequest 进行排序
【发布时间】: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 管理此问题的任何想法?

【问题讨论】:

    标签: ios core-data nsfetchrequest nssortdescriptor


    【解决方案1】:

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

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

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

    【讨论】:

    • '它不再适用于 iOS 10:'NSInvalidArgumentException',原因:'keypath entity.name not found in entity '' Markus,是否仍然可以按实体名称排序结果?你有解决办法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多