tnb121
tnb121

Reputation: 61

Use data from two (or three) entities in tableview

I have an app that stores information for golf rounds. I have three Entities that I am persisting data to: Rounds, Courses, and Tees. I structured the schema in this way because there is a two-many relationship between Rounds and Courses, and a Course can have multiple Tees (blue, white, gold, etc.)

I have a UITableview that I would like to display the results of each round in. However, I would like to display data from the Rounds Entity as well as the Courses Entity. Ideally I would also like to display the Tee for that round as well,but it's not a priority.

My question is, how do I use a FetchResultsController to get data from the three entities and display it in a single cell of a UITableview?

Here is how I am saving the data to the Entities:

HandicapAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext* context = [appDelegate managedObjectContext];

    NSEntityDescription *roundsEntity = [NSEntityDescription entityForName:@"Rounds" inManagedObjectContext:context];
NSFetchRequest *request =[[NSFetchRequest alloc]init];
[request setEntity:roundsEntity];

Rounds * rounds = [NSEntityDescription insertNewObjectForEntityForName:@"Rounds" inManagedObjectContext:context];
[rounds setValue:score forKey:@"roundScore"];
[rounds setValue:date   forKey:@"roundDate"];
[rounds setValue:differential   forKey:@"roundDifferential"];

Courses * courses = [NSEntityDescription insertNewObjectForEntityForName:@"Courses" inManagedObjectContext:context];
[courses setValue:rating forKey:@"courseRating"];
[courses setValue:slope forKey:@"courseSlope"];
[courses setValue:courseName forKey:@"courseName"];
rounds.courses = courses;

Tee * tee = [NSEntityDescription insertNewObjectForEntityForName:@"Tee" inManagedObjectContext:context];
[tee setValue:teeColor forKey:@"teeColor"];
courses.tees = tee;

NSError *error;
[context save:&error];

And then this is my FetchedResultsController

 if (_fetchedResultsController != nil)
{
    return _fetchedResultsController;
}

// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

fetchRequest.entity = [NSEntityDescription entityForName:@"Rounds" inManagedObjectContext:self.managedObjectContext];

// Set the batch size 
[fetchRequest setFetchBatchSize:20];

// Set the sort descriptor
NSSortDescriptor *  date = [[NSSortDescriptor alloc] initWithKey: @"roundDate"
                                                        ascending: NO];
NSArray *           sortDescriptors = [NSArray arrayWithObjects: date, nil];
fetchRequest.sortDescriptors = sortDescriptors;



// Initialize fetched results controller - creates cache
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc]
                                                         initWithFetchRequest: fetchRequest
                                                         managedObjectContext: self.managedObjectContext
                                                         sectionNameKeyPath: nil
                                                         cacheName: @"Master"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

// handle errors
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
    /*
     Replace this implementation with code to handle the error appropriately.

     abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
     */
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

return _fetchedResultsController;

How do I fetch the course name and tee (this will be the tee color) for the round in the tableview cell?

Thanks!!

Upvotes: 1

Views: 406

Answers (1)

Timothy Moose
Timothy Moose

Reputation: 9915

Just follow the relationships. If you've got a one-to-many relationship between rounds and courses, you'd need to have a relationship on courses like rounds and the inverse relationship on rounds like course. So, if you've generated subclasses for your entities, you'd access the course name like this:

NSString *courseName = round.course.name;

Upvotes: 1

Related Questions