1

我正在使用排序描述符设置 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'。

4

2 回答 2

7

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

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

于 2011-11-25T18:46:46.613 回答
1

请原谅我说复制数据让我畏缩有两个原因:

  • 尽管托管 iOS 的设备看起来非常强大,但它们比 iMac 更受资源限制。含义:在针对平板电脑和智能手机时,空间和时间是更为重要的因素。
  • 无论如何,为什么要费心维护两个大致相同的数据集呢?

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

或者,在提交到数据模型之前,将任意数量的字符串的第一个字母大写可能更合适。 这篇文章阐明了您可以使用

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

以此目的。

于 2011-12-26T19:53:19.393 回答