Skip to main content

NSFetchRequest for all children of a parent



How do I fetch all child entities of a parent?





I have a table populated by a parent entity in Core Data. When the user touches a cell I intend to show another table with all children of that parent.





How does the NSFetchRequest look like for this please?





Edit:





model is like this:







student>>dates [one to many, one student have many days]







So I want all dates for any given student (selected by touching in student table cell for that student), then populate dates table with dates for that student.





Thanks!


Comments

  1. Assuming that the entity and the class names are Student and Date, and the reverse relationship for Date->Student is called student,

    Student *aStudent = ...;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity: [NSEntityDescription entityForName: @"Date" inManagedObjectContext: [aStudent managedObjectContext]]];
    [fetchRequest setPredicate: [NSPredicate predicateWithFormat: @"student == %@", aStudent]];

    ReplyDelete
  2. If you have custom classes, you could traverse the generated relationship (return [student dates]). That will get you an unordered NSSet on iOS4, or, you can do it with a fetch request (note I use ARC so no releases/autoreleases here):

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Date"
    inManagedObjectContext:moc];
    [fetchRequest setEntity:entity];

    NSMutableArray *predicates = [NSMutableArray arrayWithCapacity:3];
    [predicates addObject:[NSPredicate predicateWithFormat:@"student == %@", aStudent]];

    // You might add other predicates
    [fetchRequest setPredicate:[NSCompoundPredicate andPredicateWithSubpredicates:predicates]];

    // and if you want sorted results (why not, get the database to do it for you)
    // sort by date to the top
    NSArray *sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"dateAdded" ascending:NO]];
    }
    [fetchRequest setSortDescriptors:sortDescriptors];

    NSError *error = nil;
    NSArray *sorted = [moc executeFetchRequest:fetchRequest error:&error];
    if (error) {
    // Handle the error, do something useful
    }

    return sorted;

    ReplyDelete
  3. You don't need a separate fetch request for this. All of the objects from the to-many relationship (don't call them child entities, that is misleading and incorrect) are available by accessing the relationship from the student object - something like student.dates. This gives you an NSSet, you can sort it and turn it to an array if you need to.

    ReplyDelete
  4. Within your first table delegate, when you touch a specific cell, I'll inject the specific parent property to the second table controller. For example:

    SecondController secondController = ... // alloc-init
    secondController.studentToGrab = ...


    where SecondController declaration has a studentToGrab property like the following:

    @property (nonatomic, retain) Student* studentToGrab; // use strong with ARC, if non-ARC remember to release it


    and in definition synthesize it.

    Then in your second controller, within viewDidLoad method you could do:

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"YourNameEntityForDate" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    [fetchRequest setFetchBatchSize:20];

    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"student == %@", studentToGrab];
    [fetchRequest setPredicate:predicate];

    // you can also use a sortdescriptors to order dates...

    NSError *error = nil;
    NSArray *resultArray = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if (error != nil) {

    NSLog(@"Error: %@", [error localizedDescription]);
    abort();
    }

    // use resultArray to populate something...


    A remark when you deal with table you could also use NSFetchedResultController class. It has advantages when used for displaying data in tables.

    ReplyDelete

Post a Comment

Popular posts from this blog

[韓日関係] 首相含む大幅な内閣改造の可能性…早ければ来月10日ごろ=韓国

div not scrolling properly with slimScroll plugin

I am using the slimScroll plugin for jQuery by Piotr Rochala Which is a great plugin for nice scrollbars on most browsers but I am stuck because I am using it for a chat box and whenever the user appends new text to the boxit does scroll using the .scrollTop() method however the plugin's scrollbar doesnt scroll with it and when the user wants to look though the chat history it will start scrolling from near the top. I have made a quick demo of my situation http://jsfiddle.net/DY9CT/2/ Does anyone know how to solve this problem?

Why does this javascript based printing cause Safari to refresh the page?

The page I am working on has a javascript function executed to print parts of the page. For some reason, printing in Safari, causes the window to somehow update. I say somehow, because it does not really refresh as in reload the page, but rather it starts the "rendering" of the page from start, i.e. scroll to top, flash animations start from 0, and so forth. The effect is reproduced by this fiddle: http://jsfiddle.net/fYmnB/ Clicking the print button and finishing or cancelling a print in Safari causes the screen to "go white" for a sec, which in my real website manifests itself as something "like" a reload. While running print button with, let's say, Firefox, just opens and closes the print dialogue without affecting the fiddle page in any way. Is there something with my way of calling the browsers print method that causes this, or how can it be explained - and preferably, avoided? P.S.: On my real site the same occurs with Chrome. In the ex