核心数据:对部分的更改

时间:2010-10-03 10:11:59

标签: iphone uitableview core-data

我对核心数据的常规使用模式非常熟悉,但最近偶然发现了一个问题:想象一个简单的案例,我有一个人的实体,有2个字符串属性名称和公司。我想按名称对UITableView进行排序,并按公司名称划分为多个部分。听起来很简单:

...
personFetchController_ = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                                             managedObjectContext:mainDataCenter.managedObjectContext
                                                               sectionNameKeyPath:@"company"
                                                                        cacheName:@"PersonListCache"];      
NSError *error = nil;
if (![personFetchController_ performFetch:&error])
{
    LogError(@"Error fetching persons: %@", [error localizedDescription]);
}
personFetchController_.delegate = self;

我注册为委托来听取更改,尤其是对部分的更改:

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo 
           atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
    NSIndexSet *sections = [NSIndexSet indexSetWithIndex:sectionIndex];
    switch (type) 
    {
        case NSFetchedResultsChangeInsert:
            [personTableView_ insertSections:sections withRowAnimation:UITableViewRowAnimationFade];
            break;
        case NSFetchedResultsChangeDelete:
            [personTableView_ deleteSections:sections withRowAnimation:UITableViewRowAnimationFade];
        default:
            break;
    }
}

当我添加/删除/更改某个人的姓名时,它非常有用,但如果我更改了某个人的公司名称(这意味着从一个部分移动)对于另一个),应用程序崩溃,在插入后说,该部分中的行数需要是旧值加一。

任何人都能正常工作吗?

1 个答案:

答案 0 :(得分:0)

导致此崩溃的代码很可能不在此方法中。

请发布此方法的代码:

-(void)controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:

尤其如何使用NSFetchedResultsChangeMove类型来响应更改?

在NSFetchedResultsControllerDelegate的Apple-Documentation中,他们将它用于didChangeObject:...

    case NSFetchedResultsChangeMove:
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                   withRowAnimation:UITableViewRowAnimationFade];
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                   withRowAnimation:UITableViewRowAnimationFade];
        break;

在我发现Apple-Documentation几乎包含NSFetchedResultsController所需的所有代码之前,我使用了一些来自网络的代码,我想从一些教程中可以看出,它在罕见的情况下导致了崩溃。经过一段时间后,我发现我可以在第一部分(将被删除)中的唯一对象移动到第二部分(这将是新的第一部分)时触发此操作。

从那时起,我在阅读教程^^

之前先阅读并搜索Apple-Documentation