title: reorder fetch results controller for UITableView
body: <p>I'm currently developing a holiday journal like application which stores each place you have visited by its type. For instance, a restaurant name should be stored under 'food' section. I have managed to work with core data and create the table with no problem. However, the problem is whenever I try to change the type of a place (thus tableview need to reorder), I would get an error message:</p>
  
  <pre><code>2009-07-22 21:04:58.150 HolidayTest[8662:20b] Serious application error.  Exception was caught during Core Data change processing: *** -[NSCFArray removeObjectAtIndex:]: index (4) beyond bounds (4) with userInfo (null)
  2009-07-22 21:04:58.151 HolidayTest[8662:20b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray removeObjectAtIndex:]: index (4) beyond bounds (4)'
  </code></pre>
  
  <p>I know the fetch results controller's delegate has updated the table. But the problem is the fetch controller has not updated its own section and row data. The easy way is to tell the fetch results controller to refetch its data if user changes its type. However, it's not an efficient way to manage the data.</p>
  
  <hr>
  
  <p>Thank you for your answer TahoeWolverine. Here is the code where i change the type of a place where user selects a row on a tableview to change its type. </p>
  
  <pre><code>- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
  {
      NSIndexPath *selectionIndexPath = [NSIndexPath indexPathForRow:selected inSection:0];
      UITableViewCell *checkedCell = [tableView cellForRowAtIndexPath:selectionIndexPath];
      checkedCell.accessoryType = UITableViewCellAccessoryNone;
  
      [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryCheckmark];   
      selected = indexPath.row;
      NSManagedObject *aType = [siteType objectAtIndex:indexPath.row];
      self.site.type = [aType valueForKey:@"name"];
      [tableView deselectRowAtIndexPath:indexPath animated:YES];
      [self.delegate TypeSelectionController:self didChangeType:YES];
  }
  </code></pre>
  
  <p>this code corresponds to the fetch results controller's delegate which runs the following code</p>
  
  <pre><code>- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
  {
      [self.tableView beginUpdates];
  }
  
  
  - (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:
              [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
              break;
  
          case NSFetchedResultsChangeMove:
              [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
              [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
              break;
      }
  
  }
  
  - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id) &lt;NSFetchedResultsSectionInfo&gt;)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;
      }
  
  }
  
  
  - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
  {
      [self.tableView endUpdates];
  }
  </code></pre>
  
  <p>then i will the get the error message.......</p>