我有一个核心数据实体'Person'。我需要自定义节索引标题,所以我想创建瞬态属性,根据我自己的逻辑将数据分成一些特定的部分。但是,当我使用fetchedResultsController创建获取请求时,并保持此瞬态属性“sectionNameKeyPath”初始化fetchedResultsController sectionNameKeyPath。所以,我不得不把它作为第一个排序描述符的关键。但是,这会使应用程序崩溃。是不是可以在fetchedResultsController
中使用transient属性作为sectionNameKeyPath我的崩溃日志是。
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath sectionNameKeyPath not found in entity <NSSQLEntity Person id=1>'
答案 0 :(得分:2)
对于获取的结果控制器,您可以将瞬态属性用作sectionNameKeyPath
。但是您不能在排序描述符中使用transient属性。对于基于SQLite的Core Data存储,只能在排序描述符中使用非瞬态属性。
“核心数据编程指南”中的Fetch Predicates and Sort Descriptors中记录了这一点:
另一方面,SQL存储编译谓词和排序 SQL的描述符并在数据库本身中评估结果。 这主要是为了表现,但这意味着评估 发生在非Cocoa环境中,所以排序描述符(或 依赖Cocoa的谓词)无法工作。支持的排序 选择器是...
此外,您无法使用SQLite商店对瞬态属性进行排序。
但第一个排序描述符不必与sectionNameKeyPath相同,请参阅initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:的文档
sectionNameKeyPath
...
如果此密钥路径与指定的密钥路径不同 fetchRequest中的第一个排序描述符,它们必须生成相同的 相对排序。例如,第一个排序描述符 fetchRequest可以指定持久属性的键; sectionNameKeyPath可能指定瞬态属性的键 源自持久性属性。
来自iOS开发者库的DateSectionTitles示例代码演示了这是如何工作的。