使用tableViewController中重新加载的CoreData

时间:2014-03-13 16:08:46

标签: objective-c core-data ios7 uitableview reloaddata

我在将数据保存到CoreData并在表格视图控制器上显示时遇到问题。此视频存在问题:https://www.youtube.com/watch?v=6Di9zeAeBWs&feature=youtu.be

当我删除类时不会出现任何问题。该类被正确删除。(我的视频的第1部分)。但是当我添加一个新类时,程序报告错误:

2014-03-13 16:31:02.771 IISForTeachers [30568:70b] CoreData:错误:严重的应用程序错误。在调用-controllerDidChangeContent:期间,从NSFetchedResultsController的委托中捕获到异常。无效更新:第0节中的行数无效。更新(3)后现有部分中包含的行数必须等于更新前该部分中包含的行数(3),加上或减去数字从该部分插入或删除的行(插入0,删除1)并加上或减去移入或移出该部分的行数(0移入,0移出)。使用userInfo(null) 2014-03-13 16:31:02.774 IISForTeachers [30568:70b] _context SAVED更改为持久存储。

错误之后将日期保存到持久性存储中。数据保存工作正常,因为我在表视图控制器中看到新的clas,当我再次停止并运行应用程序时,新数据就在那里。但是当我添加一个新类并且我想删除一个类时,应用程序崩溃(视频的第2部分)。

当我再次运行应用程序时,新类在表格视图中,我将其删除而没有问题(第3部分)。

这是我删除单元格的函数代码:

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    if(debug == 1){
        NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
    }

    CoreDataHelper *cdh = [(AppDelegate *) [[UIApplication sharedApplication] delegate] cdh];

    if (editingStyle == UITableViewCellEditingStyleDelete) {

        SchoolClass *class = [self.frc objectAtIndexPath:indexPath];
        [[class managedObjectContext] deleteObject:class];
    }

    [cdh saveContext];

    [self.tableView reloadData];
}

FRC

在ClassesTVC.m中获取日期(表视图控制器,其中显示所有类)。

-(void)configureFetch{
    if(debug == 1){
        NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
    }

    CoreDataHelper *cdh = [(AppDelegate *) [[UIApplication sharedApplication] delegate] cdh];

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"SchoolClass"];

    request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES], nil];

    [request setFetchBatchSize:50];

    self.frc = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                   managedObjectContext:cdh.context
                                                     sectionNameKeyPath:nil
                                                              cacheName:nil];
    self.frc.delegate = self;

}

在CoreDataTVC.h(用于表视图控制器的通用类)中,frc是definet,并被定义为fallows:

@property (strong, nonatomic) NSFetchedResultsController *frc;

那里(CoreDataTVC)也是一个函数performFetch:

-(void)performFetch{

    if(debug == 1){
        NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
    }
    if(self.frc){
        [self.frc.managedObjectContext performBlock:^{
            NSError *error = nil;
            if(![self.frc performFetch:&error]){
                NSLog(@"Failed to perform fetch: %@", error);
            }
            [self.tableView reloadData];
        }];
    }
    else{
        NSLog(@"Failed to fetch, the fetched results controller is nil.");
    }
}

编辑-----------

我更改了我的代码,现在删除行的功能如下:

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    if(debug == 1){
        NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
    }

    CoreDataHelper *cdh = [(AppDelegate *) [[UIApplication sharedApplication] delegate] cdh];

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [tableView beginUpdates];
        SchoolClass *class = [self.frc objectAtIndexPath:indexPath];
        [[class managedObjectContext] deleteObject:class];
        [tableView endUpdates];
    }

    [cdh saveContext];

    [self.tableView reloadData];
}

现在应用程序运行良好,但只有当我插入一个输入(classname)时。当我插入类名和classteacher为空时,我可以删除任何有问题的单元格。但是,当我插入两个输入(classname,classteacher)时,应用程序再次显示错误。 以下是应用行为,对于视频质量感到抱歉:https://www.youtube.com/watch?v=PqSxqjuyZbU&feature=youtu.be

错误相同:

2014-03-14 12:15:08.309 IISForTeachers [35735:70b] CoreData:错误:严重的应用程序错误。在调用-controllerDidChangeContent:期间,从NSFetchedResultsController的委托中捕获到异常。无效更新:第0节中的行数无效。更新(5)后现有部分中包含的行数必须等于更新前该部分中包含的行数(5),加上或减去数字从该部分插入或删除的行(插入0,删除1)并加上或减去移入或移出该部分的行数(0移入,0移出)。 userInfo(null)

这是将texfield分配给对象类类型的代码。我不知道哪里可能有问题。谢谢你的帮助。

-(void)textFieldDidEndEditing:(UITextField *)textField{
    if (debug == 1) {
        NSLog(@"Running %@ '%@'", self.class, NSStringFromSelector(_cmd));
    }

    CoreDataHelper *cdh = [(AppDelegate *)[[UIApplication sharedApplication]delegate]cdh];

    SchoolClass *class = (SchoolClass*) [cdh.context existingObjectWithID:self.selectedClassID error:nil];

    if(textField == self.classNameTextField){
        if([self.classNameTextField.text isEqualToString:@""])
        {
            self.classNameTextField.text = @"Nova trida";
        }
        class.name = self.classNameTextField.text;
    }
    else if (textField == self.classTeacherTextField){
        class.classTeacher = self.classTeacherTextField.text;
    }
}

1 个答案:

答案 0 :(得分:0)

删除单元格时会相应地更新您的视图,错误会告诉您UITableView的预期结果。

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    if(debug == 1){
        NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
    }

    CoreDataHelper *cdh = [(AppDelegate *) [[UIApplication sharedApplication] delegate] cdh];

    if (editingStyle == UITableViewCellEditingStyleDelete) {
[tableView beginUpdates];
        SchoolClass *class = [self.frc objectAtIndexPath:indexPath];
        [[class managedObjectContext] deleteObject:class];

        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    [cdh saveContext];
        [tableView endUpdates];
    }



}