2012-09-03 229 views
0

我需要澄清一些来自苹果文档NSFetchedResultsController:DOC澄清需要

The fetch request must have at least one sort descriptor. If the controller generates sections, the first sort descriptor in the array is used to group the objects into sections; its key must either be the same as sectionNameKeyPath or the relative ordering using its key must match that using sectionNameKeyPath.

我以下列方式

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

使用NSFetchedResultsController使用节当我从商务部了解, NSFetchRequest我在NSFetchedResultsController必须至少有一个排序描述符。但自从我使用的部分,那种描述符必须是这样的:

[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 ERROR: The fetched object at index X has an out of order section name Y. Objects must be sorted by section name'

在我的情况,使用[NSSortDescriptor sortDescriptorWithKey:@"paymentDate" ascending:YES],它允许我克服这个问题。也许我只是幸运而已)。

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

预先感谢您。

回答

1

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

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

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

编辑

例如,假设你有两种类型的描述:sd1sd2sd1使用与在sectionNameKeyPath中提供给FRC的密钥相同的密钥。 sd2使用不同的密钥。

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

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

由于它在整个数组中徘徊,它会查看sectionNameKeyPath,并期望看到具有相同sectionNameKeyPath的特定数量的条目。因此,必须对数组进行排序以将所有部分保留在一起。

如果你能做到,如果没有指定相同的密钥作为第一个排序描述符,那么一切都将正常工作。如果不是,那么你应该使用与第一个排序描述符相同的段密钥。

+0

+1您的回复。你能指定一下你的意思吗?“你不必指定它们的确切字段,但排序顺序应该是相同的。”?小样本可能会有用;-)谢谢。 –

+0

谢谢乔迪。您对核心数据有很好的了解。干杯。 –