NSFetchRequest для всех детей родителей - PullRequest
3 голосов
/ 26 февраля 2012

Как получить все дочерние объекты родителя?

У меня есть таблица, заполненная родительской сущностью в Core Data. Когда пользователь касается ячейки, я собираюсь показать другую таблицу со всеми дочерними элементами этого родителя.

Как выглядит NSFetchRequest, пожалуйста?

Edit:

модель выглядит так:

студент >> даты [один ко многим, один студент много дней]

Таким образом, я хочу, чтобы все даты для любого данного учащегося (выбирались касанием в ячейке таблицы учеников для этого ученика), а затем заполняли таблицу дат датами этого ученика.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 26 февраля 2012

Если предположить, что имена сущностей и классов Student и Date, а обратная связь для Date -> Student называется student,

Student *aStudent = ...;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity: [NSEntityDescription entityForName: @"Date" inManagedObjectContext: [aStudent managedObjectContext]]];
[fetchRequest setPredicate: [NSPredicate predicateWithFormat: @"student == %@", aStudent]];
1 голос
/ 26 февраля 2012

Для этого вам не нужен отдельный запрос на выборку.Все объекты из отношения «ко-многим» (не называйте их дочерними объектами, которые вводят в заблуждение и неверны) доступны, получая доступ к отношению из объекта ученика - что-то вроде student.dates.Это дает вам NSSet, вы можете отсортировать его и превратить в массив, если вам нужно.

0 голосов
/ 26 февраля 2012

В вашем первом делегате таблицы, когда вы дотронетесь до определенной ячейки, я добавлю определенное родительское свойство второму контроллеру таблицы. Например:

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

где SecondController объявление имеет свойство studentToGrab, подобное следующему:

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

и по определению синтезируйте его.

Тогда в вашем втором контроллере, в методе viewDidLoad, вы можете сделать:

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...

Замечание при работе с таблицей вы также можете использовать NSFetchedResultController класс. Он имеет преимущества при использовании для отображения данных в таблицах.

0 голосов
/ 26 февраля 2012

Если у вас есть пользовательские классы, вы можете пересечь сгенерированные отношения (return [student dates]).Это даст вам неупорядоченный NSSet на iOS4, или вы можете сделать это с помощью запроса на выборку (обратите внимание, я использую ARC, поэтому здесь нет выпусков / авто-выпусков):

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;
...