The simple app I'm building to expose the gaps in my beginner's understanding of Core Data relationships is doing just that. Here's a brief description:
The app has three views: HomeViewController
, AddViewController
, and AddCategoryViewController
.
My data model has two Entities, with relationships like this:
New WMDGCategory
objects are added via a textfield in AddCategoryViewController
and new WMDGActivity
objects are added via a textfield in AddViewController
.
My goal is to be able to display WMDGActivity objects in the tableview in HomeViewController, grouped under sections defined by WMDGCategory objects.
Currently, when I fire it up in the sim, no crash, but I get this error stack:
2014-03-03 12:39:07.893 EntitiesAndRelationships[323:a0b] +[NSManagedObjectContext(MagicalRecord) MR_contextWithStoreCoordinator:](0x2f80ac) -> Created Context UNNAMED
2014-03-03 12:39:07.895 EntitiesAndRelationships[323:a0b] +[NSManagedObjectContext(MagicalRecord) MR_setRootSavingContext:](0x2f80ac) Set Root Saving Context: <NSManagedObjectContext: 0x8dadea0>
2014-03-03 12:39:07.899 EntitiesAndRelationships[323:a0b] +[NSManagedObjectContext(MagicalRecord) MR_newMainQueueContext](0x2f80ac) Created Main Queue Context: <NSManagedObjectContext: 0x8aa4180>
2014-03-03 12:39:07.900 EntitiesAndRelationships[323:a0b] +[NSManagedObjectContext(MagicalRecord) MR_setDefaultContext:](0x2f80ac) Set Default Context: <NSManagedObjectContext: 0x8aa4180>
2014-03-03 12:39:07.916 EntitiesAndRelationships[323:a0b] CoreData: error: (NSFetchedResultsController) object <WMDGActivity: 0x8aabff0> (entity: WMDGActivity; id: 0x8aac930 <x-coredata://126C2FFD-8184-43B1-AA4D-AEFBE1AAC1A1/WMDGActivity/p1> ; data: {
category = nil;
name = Programming;
toCategory = nil;
}) returned nil value for section name key path 'toCategory.name'. Object will be placed in unnamed section
2014-03-03 12:39:07.917 EntitiesAndRelationships[323:a0b] CoreData: error: (NSFetchedResultsController) object <WMDGActivity: 0x8aad520> (entity: WMDGActivity; id: 0x8aac940 <x-coredata://126C2FFD-8184-43B1-AA4D-AEFBE1AAC1A1/WMDGActivity/p2> ; data: {
category = nil;
name = "New Workplace Activity";
toCategory = nil;
}) returned nil value for section name key path 'toCategory.name'. Object will be placed in unnamed section
When I add a new activity and assign it to an existing category using this code:
- (IBAction)saveButton:(UIBarButtonItem *)sender
{
if (self.activityField.text.length > 0)
{
if (self.categoryLabel.text.length < 1)
{
self.thisCategory.name = @"Uncategorized";
}
else
{
self.thisCategory.name = self.categoryLabel.text;
self.thisActivity.name = self.activityField.text;
self.thisActivity.toCategory.name = self.categoryLabel.text;
NSLog(@"Category name is %@", self.thisCategory.name);
NSLog(@"Activity name is %@", self.thisActivity.name);
}
[self.delegate addViewControllerDidSave];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No activity entered"
message:@"Please enter a new activity or Cancel"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
}
Nothing shows up in my tableview, and I get this error call stack:
2014-03-03 13:08:24.321 EntitiesAndRelationships[323:a0b] Number of categories is 2
2014-03-03 13:08:24.323 EntitiesAndRelationships[323:a0b] Number of categories is 2
2014-03-03 13:08:24.328 EntitiesAndRelationships[323:a0b] Number of categories is 2
2014-03-03 13:08:24.329 EntitiesAndRelationships[323:a0b] Number of categories is 2
2014-03-03 13:08:24.333 EntitiesAndRelationships[323:a0b] Title of row is <WMDGCategory: 0x8ac0c20> (entity: WMDGCategory; id: 0x8ac4640 <x-coredata://126C2FFD-8184-43B1-AA4D-AEFBE1AAC1A1/WMDGCategory/p2> ; data: <fault>)
2014-03-03 13:08:24.335 EntitiesAndRelationships[323:a0b] Title of row is <WMDGCategory: 0x8ac0e00> (entity: WMDGCategory; id: 0x8ac4730 <x-coredata://126C2FFD-8184-43B1-AA4D-AEFBE1AAC1A1/WMDGCategory/p1> ; data: <fault>)
2014-03-03 13:08:24.338 EntitiesAndRelationships[323:a0b] Title of row is <WMDGCategory: 0x8ac0c20> (entity: WMDGCategory; id: 0x8ac4640 <x-coredata://126C2FFD-8184-43B1-AA4D-AEFBE1AAC1A1/WMDGCategory/p2> ; data: {
activities = "<relationship fault: 0x8ad7ca0 'activities'>";
name = Sports;
})
2014-03-03 13:08:24.339 EntitiesAndRelationships[323:a0b] Title of row is <WMDGCategory: 0x8ac0e00> (entity: WMDGCategory; id: 0x8ac4730 <x-coredata://126C2FFD-8184-43B1-AA4D-AEFBE1AAC1A1/WMDGCategory/p1> ; data: {
activities = "<relationship fault: 0x8dc0520 'activities'>";
name = WORKPLACE;
})
2014-03-03 13:08:24.342 EntitiesAndRelationships[323:a0b] Title of row is <WMDGCategory: 0x8ac0c20> (entity: WMDGCategory; id: 0x8ac4640 <x-coredata://126C2FFD-8184-43B1-AA4D-AEFBE1AAC1A1/WMDGCategory/p2> ; data: {
activities = "<relationship fault: 0x8ad7ca0 'activities'>";
name = Sports;
})
2014-03-03 13:08:29.393 EntitiesAndRelationships[323:a0b] Title of row is <WMDGCategory: 0x8ac0e00> (entity: WMDGCategory; id: 0x8ac4730 <x-coredata://126C2FFD-8184-43B1-AA4D-AEFBE1AAC1A1/WMDGCategory/p1> ; data: {
activities = "<relationship fault: 0x8dc0520 'activities'>";
name = WORKPLACE;
})
2014-03-03 13:12:08.187 EntitiesAndRelationships[323:a0b] Category name is (null)
2014-03-03 13:12:08.187 EntitiesAndRelationships[323:a0b] Activity name is Meeting
2014-03-03 13:12:11.077 EntitiesAndRelationships[323:a0b] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8aa4180) → Saving <NSManagedObjectContext (0x8aa4180): *** DEFAULT ***> on *** MAIN THREAD ***
2014-03-03 13:12:11.077 EntitiesAndRelationships[323:a0b] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8aa4180) → Save Parents? 1
2014-03-03 13:12:11.078 EntitiesAndRelationships[323:a0b] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8aa4180) → Save Synchronously? 1
2014-03-03 13:12:11.078 EntitiesAndRelationships[323:a0b] -[NSManagedObjectContext(MagicalRecord) MR_contextWillSave:](0x8aa4180) Context DEFAULT is about to save. Obtaining permanent IDs for new 1 inserted objects
2014-03-03 13:12:11.081 EntitiesAndRelationships[323:a0b] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8dadea0) → Saving <NSManagedObjectContext (0x8dadea0): *** BACKGROUND SAVING (ROOT) ***> on *** MAIN THREAD ***
2014-03-03 13:12:11.082 EntitiesAndRelationships[323:a0b] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8dadea0) → Save Parents? 1
2014-03-03 13:12:11.082 EntitiesAndRelationships[323:a0b] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8dadea0) → Save Synchronously? 1
2014-03-03 13:12:11.083 EntitiesAndRelationships[323:a0b] -[NSManagedObjectContext(MagicalRecord) MR_contextWillSave:](0x8dadea0) Context BACKGROUND SAVING (ROOT) is about to save. Obtaining permanent IDs for new 1 inserted objects
2014-03-03 13:12:11.085 EntitiesAndRelationships[323:a0b] __70-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:]_block_invoke25(0x8dadea0) → Finished saving: <NSManagedObjectContext (0x8dadea0): *** BACKGROUND SAVING (ROOT) ***> on *** MAIN THREAD ***
2014-03-03 13:12:11.088 EntitiesAndRelationships[323:a0b] CoreData: error: (NSFetchedResultsController) object <WMDGActivity: 0x8aabff0> (entity: WMDGActivity; id: 0x8aac930 <x-coredata://126C2FFD-8184-43B1-AA4D-AEFBE1AAC1A1/WMDGActivity/p1> ; data: {
category = nil;
name = Programming;
toCategory = nil;
}) returned nil value for section name key path 'toCategory.name'. Object will be placed in unnamed section
2014-03-03 13:12:11.088 EntitiesAndRelationships[323:a0b] CoreData: error: (NSFetchedResultsController) object <WMDGActivity: 0x8aad520> (entity: WMDGActivity; id: 0x8aac940 <x-coredata://126C2FFD-8184-43B1-AA4D-AEFBE1AAC1A1/WMDGActivity/p2> ; data: {
category = nil;
name = "New Workplace Activity";
toCategory = nil;
}) returned nil value for section name key path 'toCategory.name'. Object will be placed in unnamed section
2014-03-03 13:12:11.097 EntitiesAndRelationships[323:a0b] CoreData: error: (NSFetchedResultsController) object <WMDGActivity: 0x8a87970> (entity: WMDGActivity; id: 0x8acabc0 <x-coredata://126C2FFD-8184-43B1-AA4D-AEFBE1AAC1A1/WMDGActivity/p3> ; data: {
category = nil;
name = Meeting;
toCategory = nil;
}) returned nil value for section name key path 'toCategory.name'. Object will be placed in unnamed section
I know this is long, and I much appreciate your time in helping me out. I'm committed to understanding this.
Thanks!
Edit--response to answer below by Wain
I modified my code like so, which I thought addressed both your points, i.e,
1) thisCategory
is a WMDGCategory
property of self
2) And I thought the modified code in the else
statement below would fix the toCategory
problem
- (IBAction)saveButton:(UIBarButtonItem *)sender
{
if (self.activityField.text.length > 0)
{
if (self.categoryLabel.text.length < 1)
{
self.thisCategory.name = @"Uncategorized";
}
else
{
self.thisCategory.name = self.categoryLabel.text;
self.thisActivity.name = self.activityField.text;
self.thisActivity.toCategory.name = self.thisCategory.name;
NSLog(@"Category name is %@", self.thisCategory.name);
NSLog(@"Activity name is %@", self.thisActivity.name);
}
[self.delegate addViewControllerDidSave];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No activity entered"
message:@"Please enter a new activity or Cancel"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
}
However, I still get the same readout--some variant of:
category = nil;
name = Zoomba;
toCategory = nil;