使用NSFetchedResultController删除行没有索引处的对象

时间:2013-11-03 21:18:34

标签: uitableview core-data nsfetchedresultscontroller

我正在尝试使用NSFetchedResultController从TableView中删除行,我已经阅读了很多关于如何执行此操作的示例,我无法弄清楚我做错了什么。我需要帮助。

这是我得到的错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'no object at index 1 in section at index 0'

这是我的删除代码:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    NSLog(@"Deleting object at row %d", indexPath.row);

    // DeleteObject
    NSManagedObject *objToDelete = (NSManagedObject*)[self.fetchedResultsController objectAtIndexPath:indexPath];

    // Delete
    [self.fetchedResultsController.managedObjectContext deleteObject:objToDelete];

    NSError *error = nil;
    [self.fetchedResultsController.managedObjectContext save:&error];
    if(error)
    {
        NSLog(@"DeleteRow caused : %@", error);
    }
}

这是我的fetchController

- (NSFetchedResultsController *)fetchedResultsController {


    AppDelegate *appdelegate = [[UIApplication sharedApplication]delegate];
    context = [appdelegate managedObjectContext];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Dagbok" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];


    NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                              initWithKey:@"header" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
    [fetchRequest setFetchBatchSize:40];
    [fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"relationship", nil]];

    NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:context sectionNameKeyPath:nil
                                                   cacheName:@"Root"];
    _fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

    NSArray *matchingdata = [context executeFetchRequest:fetchRequest error:nil];


    return _fetchedResultsController;

}

这是我的ObjectChanged

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


    UITableView *tableView = _tabell;

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:(VallaDagbokCell*)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            break;

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

1 个答案:

答案 0 :(得分:0)

您似乎已经消除了取出的结果控制器的延迟加载。因此不清楚何时正在执行FRC getter中的获取请求。看来这种情况发生在之前委托方法删除了行。

尝试重新插入原始的延迟加载代码段来修复FRC getter:

if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
}
相关问题