Serious Application Error in Core Data with fetchedResultsContainer

Christoph picture Christoph · Oct 14, 2010 · Viewed 14.6k times · Source

I get the following error when trying to add a record:

Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. The index 0 is invalid with userInfo (null)

And that's it. I put breakpoints into all the fetchedResultsContainer delegate methods I have implemented, but nothing breaks.

I tracked it down to:

  NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"titleFirstLetter" cacheName:@"Root"];

"sectionNameKeyPath" is the problem. "titleFirstLetter" is a transient property that I created a getter for in my NSManagedObject subclass.

Here's the getter:

-(NSString *)titleFirstLetter
{
  [self willAccessValueForKey:@"titleFirstLetter"];
  NSString *aString = [[self valueForKey:@"title"] uppercaseString];

  NSString *stringToReturn = [aString substringWithRange:[aString rangeOfComposedCharacterSequenceAtIndex:0]];

  [self didAccessValueForKey:@"titleFirstLetter"];
  return stringToReturn;
}

When I change the sectionNameKeyPath to nil, it works, but is obviously not what I want. It also works when I have a title already filled in for my model, so that titleFirstLetter doesn't return nil, though that doesn't seem to be quite the problem. If I make the string something arbitrary if it's nil, it still crashes.

Any idea what's up here?

UPDATE: If I use the title in the sectionNameKeyPath instead of the transient property, it doesn't crash, but obviously puts every item in its own section. So it's somehow related to the transient property...

UPDATE2: Some preliminary hacking with using a persistent property instead of transient, and no other changes, seems to work just fine, so this looks to be a bug. I have a bug report open: #8553064

UPDATE3: Well, scratch that. Using a persistent attribute didn't make any difference. I am somewhat at whits end now.

Thanks!

Answer

Christoph picture Christoph · Oct 16, 2010

Well, this is probably partly (or fully) user error. The problem was that, in the view in which I add a new item, I had put [self.tableView reloadData] inside the viewWillAppear method. Commenting that out did not updated the table cells, but prevented the crash.

I then went ahead and sent reloadRowsAtIndexPaths:withRowAnimation: to the table view to manually reload the few cells that needed it.

I am glad that's finally over!