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

Posted

技术标签:

【中文标题】基于瞬态属性获取的结果控制器 sectionIndexTitle【英文标题】:Fetched results controller sectionIndexTitle based on transient attributes 【发布时间】:2012-12-14 10:55:53 【问题描述】:

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

我的崩溃日志是。

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

【问题讨论】:

【参考方案1】:

您可以将瞬态属性作为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 示例代码演示了它是如何工作的。

【讨论】:

以上是关于基于瞬态属性获取的结果控制器 sectionIndexTitle的主要内容,如果未能解决你的问题,请参考以下文章

Grails 瞬态属性未在对象创建时获取

非空属性引用瞬态值 - 瞬态实例必须在当前操作之前保存

如何刷新基于_id(非瞬态)的关系与获取不同步的对象

将获取的结果 NSDate 分成每天使用核心数据的部分

JPA 瞬态注释和 JSON

Pandas使用str属性获取数据列的字符串方法类split函数基于指定分隔符拆分数据列的内容为列表设置参数n控制拆分的次数设置expand参数将拆分结果列表内容转化为多列dataframe