根据瞬态属性获取结果控制器sectionIndexTitle

时间:2012-12-14 10:55:54

标签: objective-c ios core-data

我有一个核心数据实体'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>' 

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示例代码演示了这是如何工作的。