NSFetchedResultsController - 乱序部分错误

时间:2011-11-25 18:03:10

标签: core-data nsfetchedresultscontroller nssortdescriptor

我正在使用排序描述符

设置NSFetchedResultsController
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@”name” ascending:YES selector:@selector(caseInsensitiveCompare:)];

部分
aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@”name” cacheName:nil];

然后我还设置了表视图部分的委托:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return [self.fetchedController sectionIndexTitles];
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
    return [self.fetchedController sectionForSectionIndexTitle:title atIndex:index];
}

有时候,当我插入对象时,我收到错误“索引X处的获取对象有一个乱序的部分名称'。对象必须按部分名称排序'”;

我正在插入数千行。当错误发生时,它始终具有相同的情况:我有10个对象称为相同的东西,但有些是大写,有些是小写。示例:nameexample,nameExample,nameEXAMPLE,nameexample,nameExample等。

知道为什么我会收到错误,我该如何解决? 我之所以不区分大小写的原因是因为我的部分基于第一个字母,如果我没有它不区分大小写,我会得到“a”部分和“A”部分。

2 个答案:

答案 0 :(得分:6)

我认为该部分的顺序与排序的顺序不同,因为虽然我使用相同的属性,但是一个不区分大小写,另一个不是。

解决方案:我在核心数据中添加了另一个属性,其中包含小写的名称,我在该部分中使用此属性并进行排序。这样我就不必调用@selector(caseInsensitiveCompare :)

答案 1 :(得分:1)

当我说复制数据让我感到畏缩时,原谅我有两个原因:

  • 虽然托管iOS的设备看起来非常强大,但它们更多 资源约束比说iMac。意义:空间和时间 针对平板电脑和智能手机时更重要的因素 手机。
  • 无论如何,为什么要让自己度过难关 维护两个大致相同的数据集?

对于那些具有空间意识或反思意识的人:我认为更合适的解决方案会在提交数据模型之前强制存储数据小写;并在显示之前系统地调整字母。理论上,这使得搜索更简单(更快),并且肯定需要更少的内存。

或者,在提交数据模型之前,将任意数量的字符串的首字母大写更合适也许更合适。 This post澄清您可以使用

managedObject.string = [stringToBeCommitted capitalizedString];
NSError *error = nil;
if(![managedObjectContext save:&error]) {
    ...
}

为此目的。