基于瞬态属性获取的结果控制器sectionIndexTitle



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

我的故障日志是.

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

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

这在"核心数据编程指南"中的提取谓词和排序描述符中有记录:

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

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

sectionNameKeyPath

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

iOS开发人员库中的DateSectionTitles示例代码演示了它的工作原理。

最新更新