So I have a Project with a UITabBarController and a few Navigation Controllers, and I am trying to implement Core Data. Its just not working.
I have a bit of a weird setup:
UITabBarController -> Navigation Controller -> Table View Controller
I have copied all of the Core Data code and added an entity with an attribute (‘Event’ and ‘name’ – just like the tutorials). I keep getting the error:
erminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘+entityForName: could not locate an NSManagedObjectModel for entity name ‘Event”
The error only occurs when I switch to the Table View I want populated by the Core Data content.
I found that the error occurs on this line in the Table View Controller:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];
This seems to correspond with this (in the App Delegate):
NSManagedObjectContext *context = [self managedObjectContext];
if (!context) {
// Handle the error.
NSLog(@"\nCould not create *context for self");
}
rootViewController.managedObjectContext = context;
Any Help?
Update: I managed to get it working (very exciting moment, and Stanford is winning at the half – so far its a good day). I am now referencing it from the App Delegate. Ahhh, this feels soo good 🙂
Your managed object context is probably not set and the entity “Event” is obviously not valid for a nil context.
I use a reference to my app delegate in all my view controllers so they can access the one managed object context. It sounds like others often use a singleton to manage Core Data and would get the managed object context from that.
UPDATE
There is a good discussion about where to keep the Core Data stack in Where to place the “Core Data Stack” in a Cocoa/Cocoa Touch application.
Here is some example code for keeping the Core Data stack in the app delegate:
Use Apple’s standard Core Data stack implementation in YourAppDelegate. managedObjectContext is implemented as an example, but managedObjectModel and persistentStoreCoordinator must be implemented as well.
YourAppDelegate.h:
YourAppDelegate.m:
In every view controller, get a reference to the app delegate and use it to get the managedObjectContext as needed. For example, when setting up the fetchedResultsController;
RootViewController.h:
RootViewController.m: