The key phrase is this:
"Can I fetch a Game and then access everything associated with that Game from that Game?"
The answer is "Yes".
You traverse the entire "tree" based on a single fetch request, by simply referencing the pointers to sets (or whatever) that are defined within your entities, and allow Core Data to handle when it needs to load various entities.
This made no sense to me to begin with but when I quit fighting it I found it to be so much easier than I thought.
This is from a project of mine:
@property (nonatomic, retain) NSString * goalName;
@property (nonatomic, retain) NSData * goalPicture;
@property (nonatomic, retain) NSNumber * indexOrder;
@property (nonatomic, retain) NSNumber * wordPicture;
@property (nonatomic, retain) NSSet *item;
@property (nonatomic, retain) User *user;
@property (nonatomic, retain) NSSet *video;
In my case, the user is the top level node in the tree, and there can be multiple items under each goal as well as multiple videos.
Once I have done a fetch request for a given User, I can access the goals for that user with an NSSet in the user entity. So, I get the set of goals with:
NSSet *goals = userObj.goal;
Goal *g = [goals anyObject]; // for example.
Then, if I want the items "contained" within a given goal:
NSSet *items = g.items;
Item *i = [items anyObject];
and so on. The important thing is that core data will load the entities efficiently. If you have 10,000 items attached to a particular goal you don't have to worry about those getting fetched until they're actually needed...