【问题标题】:Fetched results controller sectionIndexTitle based on transient attributes基于瞬态属性获取的结果控制器 sectionIndexTitle
【发布时间】: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>' 

【问题讨论】:

    标签: objective-c ios core-data


    【解决方案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 示例代码演示了它是如何工作的。

    【讨论】:

      猜你喜欢
      • 2014-11-15
      • 2011-09-16
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多