【问题标题】:NSFetchedResultsController: doc clarification neededNSFetchedResultsController:需要文档说明
【发布时间】:2012-08-28 06:24:38
【问题描述】:

我需要 Apple 文档中的一些说明

获取请求必须至少有一个排序描述符。如果 控制器生成节,数组中的第一个排序描述符 用于将对象分组;它的键必须是 与 sectionNameKeyPath 相同或使用其键的相对排序必须 使用 sectionNameKeyPath 匹配。

我正在使用NSFetchedResultsController 以下列方式包含部分

[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:mainContext
                                      sectionNameKeyPath:@"paymentDate"
                                               cacheName:nil];

据我了解,我在NSFetchedResultsController 中传递的NSFetchRequest 必须至少有一个排序描述符。但是由于我使用sections,所以排序描述符必须如下:

[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:
        [NSSortDescriptor sortDescriptorWithKey:@"paymentDate" ascending:YES],
        [NSSortDescriptor sortDescriptorWithKey:@"paymentCode" ascending:YES],
        nil]];

如果我使用类似的排序描述符

[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:
        [NSSortDescriptor sortDescriptorWithKey:@"paymentCode" ascending:YES],
        nil]];

我收到如下错误

NSFetchedResultsController 错误:在索引 X 处获取的对象有一个 乱序节名 Y。对象必须按节名排序'

就我而言,使用[NSSortDescriptor sortDescriptorWithKey:@"paymentDate" ascending:YES],它可以让我克服这个问题。也许我只是幸运;)。

但是,这是什么意思或者使用其键的相对排序必须与使用 sectionNameKeyPath 的相对排序相匹配?你能给我解释一下吗?

提前谢谢你。

【问题讨论】:

    标签: ios core-data nsfetchedresultscontroller nsfetchrequest


    【解决方案1】:

    如果您使用部分,则 FRC 需要知道如何对数据数组进行排序,以便它可以按部分对所有结果进行分组。因此,无论您在获取请求中指定为第一个排序描述符的任何内容,都必须与您的部分的分组方式相匹配,以便 FRC 可以正确执行。

    您不必指定它们的确切字段,但排序顺序应该相同。

    例如,如果您的第一个排序描述符将按部分对数组进行分组,即使它没有引用该部分,那也可以。在大多数情况下,您应该明确指定您的 section 属性,以消除 FRC 造成混淆的任何可能性——否则它将引发异常。

    编辑

    例如,假设您有两个排序描述符:sd1sd2sd1 使用的密钥与在 sectionNameKeyPath 中提供给 FRC 的密钥相同。 sd2 使用不同的密钥。

    当您对整个数组进行排序时,如果它们都生成了一个将实体分组到相同部分中的最终数组,那么您可以使用sd1sd2 作为第一个排序描述符。

    基本上,FRC 将根据sectionNameKeyPath 将实体分组为多个部分,因此它可以确定有多少个部分,以及每个部分中有多少行。因此,它作为输入得到的数组必须被分类到类似的分组中,相对于sectionNameKeyPath

    在遍历数组时,它会查看sectionNameKeyPath,并期望看到特定数量的具有相同sectionNameKeyPath 的条目。因此,必须对数组进行排序以将所有部分保持在一起。

    如果您可以在不指定与第一个排序描述符相同的键的情况下完成此操作,那么一切都会正常工作。如果不是,那么您应该使用与第一个排序描述符相同的节键。

    【讨论】:

    • +1 为您的回复。您能否指定“您不必指定它们的确切字段,但排序顺序应该相同。”是什么意思?一个小样本可能会有用 ;-) 谢谢。
    • 谢谢乔迪。你对核心数据有很好的了解。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    相关资源
    最近更新 更多