Note that there are some explanatory texts on larger screens.

plurals
  1. POFetching child objects belongs to parent object & put them in tableView (core-data, relationships)
    primarykey
    data
    text
    <p>I have two tableViews, the main one adds the parent object, and when you click on a parent object in the tableView, it takes you to the child tableView, I did the first part successfully, but when it comes to fetching the "RIGHT" child objects I get confused, I way I do it is that I fetch ALL child object, the using enumeration I pick the right ones and put then into a NSSet, but that doesn't work, here's the child object table view.m: </p> <pre><code> #import "MinorGoalsTableViewController.h" @interface MinorGoalsTableViewController () @end @implementation MinorGoalsTableViewController @synthesize selectedGoal = _selectedGoal; @synthesize fetchedResultsController = _fetchedResultsController; @synthesize minorGoalsSet; // init with goal (for GTVC) - (id) initWithGoal:(Goal *)goal { if (self = [super init]) { _selectedGoal = goal; } return self; } - (id)initWithStyle:(UITableViewStyle)style { self = [super initWithStyle:style]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; NSError *error = nil; // Uncomment the following line to preserve selection between presentations. // self.clearsSelectionOnViewWillAppear = NO; // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem; NSLog(@"Minor Goals in %@ are: %lu", self.selectedGoal.title , (unsigned long)[self.selectedGoal.minorGoal count]); // self.minorGoalsSet = nil; // initializing minorGoalsSet self.minorGoalsSet = [[NSMutableSet alloc] init]; // performing fetch if (![self.fetchedResultsController performFetch:&amp;error]) { NSLog(@"Error fetching all minor goals: %@", error); abort(); } // creating NSSet that will carry all selectedGoal minor goals NSSet *minorGoals = self.selectedGoal.minorGoal; // creating a loop to add minor goals in minorGoalsSet // add existing minor goals in selected goal to minorGoalsSet for (MinorGoal *minor in minorGoals) { [minorGoalsSet addObject:minor]; } NSLog(@"minor goals in set: %lu", (unsigned long) [minorGoalsSet count]); NSLog(@"minor goals in set2: %lu", (unsigned long) [minorGoals count]); // setting nav title to selected goal title self.navigationItem.title = _selectedGoal.title; // adding "add" button to nav self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addNewMinorGoal)]; } - (void) viewWillDisappear:(BOOL)animated { self.selectedGoal = nil; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } </code></pre> <h1>pragma mark - Table view data source</h1> <pre><code> - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [self.selectedGoal.minorGoal count]; // id &lt;NSFetchedResultsSectionInfo&gt; secInfo = [[self.fetchedResultsController sections] objectAtIndex:section]; // return [secInfo numberOfObjects]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } cell.accessoryType = UITableViewCellAccessoryNone; // Configure the cell... MinorGoal *minor = [self.fetchedResultsController objectAtIndexPath:indexPath]; // well see about that later if ([minorGoalsSet containsObject:minor]) { cell.textLabel.text = minor.title; } // setting cell's title to minor goal's title // cell.textLabel.text = minor.title; return cell; } </code></pre> <h1>pragma mark - fetched results controller method</h1> <pre><code> - (NSFetchedResultsController*) fetchedResultsController { if (_fetchedResultsController != nil) { return _fetchedResultsController; } // creating fetch request NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"MinorGoal" inManagedObjectContext:self.selectedGoal.managedObjectContext]; [fetchRequest setEntity:entity]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [fetchRequest setSortDescriptors:sortDescriptors]; // setting _fetchedResultsController _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.selectedGoal.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; // performing fetch NSError *error = nil; if (![self.fetchedResultsController performFetch:&amp;error]) { NSLog(@"Error fetching minors: %@", error); } // returning return _fetchedResultsController; } </code></pre> <h1>pragma mark - Table view delegate</h1> <pre><code> - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { } - (void) addNewMinorGoal { // code to show UIAlertView that will add new minor goal // creating UIAlertView UIAlertView *addMinorGoalAlert = [[UIAlertView alloc] initWithTitle:@"Add Minor Goal" message:@"Minor Goal Title" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Save", nil]; // Adding plain textfield for minor goal title addMinorGoalAlert.alertViewStyle = UIAlertViewStylePlainTextInput; // showing UIAlertView [addMinorGoalAlert show]; } </code></pre> <h1>pragma mark - UIAlertView for Add New Minor Delegation</h1> <pre><code> - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex == 0) { NSLog(@"Adding Minor Goal Canceled!"); } else { // creating string will carry textField value NSString *minorTitle = [[alertView textFieldAtIndex:0]text]; // creating new minor goal MinorGoal *newMinorGoal = [NSEntityDescription insertNewObjectForEntityForName:@"MinorGoal" inManagedObjectContext:self.selectedGoal.managedObjectContext]; // setting title of new minor goal newMinorGoal.title = minorTitle; [self.selectedGoal addMinorGoalObject:newMinorGoal]; // saving NSError *error = nil; if (![self.selectedGoal.managedObjectContext save:&amp;error]) { NSLog(@"Error saving new minor goal: %@", error); } NSLog(@"we save %@ to %@ and theres %lu in it", newMinorGoal.title, self.selectedGoal.title, (unsigned long) [self.selectedGoal.minorGoal count]); // fetching [self.fetchedResultsController performFetch:&amp;error]; // reloading tableView data [self.tableView reloadData]; } } @end </code></pre> <p>Just tell me the right way to fetch the right child object, and should i put them in a NSSet?</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload