Как создать NSFetchRequest, который фильтрует объекты Core Data на основе родительских отношений? - PullRequest
1 голос
/ 04 февраля 2011

У меня есть базовая модель данных, подобная этой:

  • Компания
    • атрибут companyName (строка)
    • Отношение ко-многим к сущностям Сотрудника.
  • Сотрудник
    • атрибут employeeID (строка)
    • Отношение «один к одному» с материнской компанией

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

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)ip 
{
    EmployeeListViewController *anotherViewController = [[EmployeeListViewController alloc] init];
    [anotherViewController setCompany:[companyList objectAtIndex:[ip row]]];
    [[self navigationController] pushViewController:anotherViewController animated:YES];
    [anotherViewController release];
}

В контроллере представления Employee для компании задан NSManagedObject.

- (void)setCompany:(NSManagedObject *)co
{
    [co retain];
    [company release];
    company = co;

    [self setTitle:[company valueForKey:@"companyName"]];
}

Мой код для добавления нового сотрудника выглядит так:

employee = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:moc];
[[company mutableSetValueForKey:@"employee"] addObject:employee];
[employee setValue:employeeID forKey:@"employeeID"];

Это похоже на правильную вставку базы данных, и я вижу идентификатор внешнего ключа компании, вставленный в таблицу Employee.

Я пытаюсь собрать всех сотрудников в компании, но я застреваю.

Вот что у меня есть для NSFetchRequest, но он просто дает мне все сотрудника (не по компании):

NSManagedObjectContext *moc = [self managedObjectContext];

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

NSError *error = nil;
NSArray *results = [moc executeFetchRequest:fetch error:&error];

[fetch release];

1 Ответ

1 голос
/ 05 февраля 2011

Это можно сделать просто, если вы генерируете классы для ваших сущностей.Когда вы редактируете модель в XCode, нажмите Cmd-N, чтобы создать новый файл.Выберите iOS Cocoa Touch Class слева и выберите класс управляемых объектов справа.Нажмите Next, Next, Next и файлы классов, которые представляют ваши сущности, будут созданы для вас.

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

Ваш код создания будет выглядеть примерно так:

Employee *employee = (Employee*)[NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:moc];
employee.employeeID = employeeID;
[company addEmployeesObject:employee];

Затем, чтобы получить список сотрудников, связанных с вашей компанией, это так просто:

for(Employee *employee in company.employees) {
    // Do something with the employee
}
...