How to reload Table view after inserting object in core data

core-data, ios, objective-c

Solution

There are some standard methods in fetchedResultController that you should override. Look at the code below:-

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

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

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

UITableView *tableView = self.tableView;

switch (type) {
    case NSFetchedResultsChangeInsert:
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;

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

    case NSFetchedResultsChangeUpdate: {
        Course *changedCourse = [self.fetchedResultsController objectAtIndexPath:indexPath];
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        cell.textLabel.text = ...;
    }
        break;

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

}

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

}

Problem

I'm trying to insert some objects in Core Data by this code ``` - (void)insertNewObject: (NSArray *) userInfo // Заносит блюдо в локальную базу данных { for (int i = 0; i < userInfo.count; i++) { billContent * bc = [userInfo objectAtIndex:i]; NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity]; NSManagedObject *nmo = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; [nmo setValue:CountID forKey:@"billId"]; [nmo setValue:bc.billAmount forKey:@"courseCount"]; [nmo setValue:bc.billCourseId forKey:@"courseId"]; [nmo setValue:bc.billPrice forKey:@"coursePrice"]; [nmo setValue:bc.billTitle forKey:@"courseTitle"]; [self saveContext]; } } - (void)saveContext { NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; NSError *error = nil; if (![context save:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } } ``` How to see this objects in my table view? I'm trying to fetch from core data agin, after inserting, by this code ``` [self makeAList]; ``` And here ``` -(void) makeAList { id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:0]; for (int i = 0; i < [sectionInfo numberOfObjects]; i ++) { NSIndexPath *ip = [NSIndexPath indexPathForRow: i inSection:0]; billContent *bc = [[billContent alloc] init]; NSManagedObject *mo = [self.fetchedResultsController objectAtIndexPath:ip]; bc.billId = [[mo valueForKey:@"billId"] description]; bc.billTitle = [[mo valueForKey:@"courseTitle"] description]; bc.billPrice = [[mo valueForKey:@"coursePrice"] description]; bc.billAmount = [[mo valueForKey:@"courseCount"] description]; bc.depId = [[mo valueForKey:@"departmentId"] description]; bc.billCourseId = [mo valueForKey:@"courseId"]; [saved addObject:bc]; } [countView1 reloadData]; ``` } But nothing works. But if I out of this class, and enter it again (load viewDidLoad) I can see new values, What i'm doing wrong?

Original source