0

我有一个核心数据实体“人”。我需要自定义部分索引标题,所以我想创建瞬态属性,根据我自己的逻辑将数据分离到某个特定部分。但是,当我使用 fetchedResultsController 创建获取请求时,并保留此瞬态属性“sectionNameKeyPath”来初始化 fetchedResultsController sectionNameKeyPath。所以,我不得不把它作为第一个排序描述符的关键。但是,这会使应用程序崩溃。是否可以在 fetchedResultsController 中使用瞬态属性作为 sectionNameKeyPath

我的崩溃日志是。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath sectionNameKeyPath not found in entity <NSSQLEntity Person id=1>' 
4

1 回答 1

2

您可以将瞬态属性用作sectionNameKeyPath获取的结果控制器。但是您不能在排序描述符中使用瞬态属性。对于基于 SQLite 的 Core Data 存储,只能在排序描述符中使用非瞬态属性。

这在“核心数据编程指南”中的Fetch Predicates and Sort Descriptors中有记录:

另一方面,SQL 存储将谓词和排序描述符编译为 SQL,并在数据库本身中评估结果。这样做主要是为了性能,但这意味着评估发生在非 Cocoa 环境中,因此依赖 Cocoa 的排序描述符(或谓词)无法工作。支持的排序选择器是……
此外,您不能使用 SQLite 存储对瞬态属性进行排序。

但第一个排序描述符不必与sectionNameKeyPath相同,参见initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName的文档:

sectionNameKeyPath
...
如果此键路径与 fetchRequest 中第一个排序描述符指定的不同,则它们必须生成相同的相对排序。例如, fetchRequest 中的第一个排序描述符可能会指定持久属性的键;sectionNameKeyPath 可能为从持久属性派生的瞬态属性指定一个键。

iOS 开发人员库中的DateSectionTitles示例代码演示了它是如何工作的。

于 2012-12-14T11:49:46.973 回答