0

我有一个奇怪的问题,我无法弄清楚。我有一个相当典型的从 SQLite 存储中获取对象的UIViewControlleraUITableView和a 。NSFetchedResultsController提取工作正常,表格工作正常,具有典型的NSFetchedResultsController样板:

-(void)controllerWillChangeContent:(NSFetchedResultsController *)controller{

    [self.tableView beginUpdates];
}
-(void)controller:(NSFetchedResultsController *)controller didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type{

    if(type==NSFetchedResultsChangeInsert){
        [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
    } else if(type==NSFetchedResultsChangeDelete){
        [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
    }

}
-(void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath{

    UITableView *tV = self.tableView;
    if(type==NSFetchedResultsChangeInsert){
        [tV insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
    } else if(type==NSFetchedResultsChangeDelete){
        [tV deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    } else if(type==NSFetchedResultsChangeUpdate){
        [self configureCell:[tV cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
    } else if(type==NSFetchedResultsChangeMove){
        [tV deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [tV insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
    }

}
-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller{
    [self.tableView endUpdates];
}

我遇到的问题是任何关系为 nil 的对象(即使关系属性不涉及谓词或排序描述符中的获取请求)在任何时候从获取的结果中消失(controller:didChangeObject:被调用NSFetchedResultsChangeDelete)以任何方式更新(例如更改不相关的属性)。如果我重新执行提取,该对象将返回。

即使我在 fetch 请求中不使用谓词,也会发生这种情况。

有人知道这里会发生什么吗?

4

1 回答 1

0

我可以通过更改我的 NSFetchedResultsController 上的 sectionNameKeyPath 来解决这个问题。如果您的 sectionNameKeyPath 属性是可选的关系属性,请尝试删除或更改它。

如果您实际上想使用该属性来分隔各个部分,则可能需要使用“虚拟”对象来表示 nil。(这实际上意味着如果您将其用于您的部分,则该属性不能是可选的。)

于 2013-05-10T00:02:00.487 回答