如何根据父关系创建过滤Core Data对象的NSFetchRequest?

时间:2011-02-04 20:46:47

标签: iphone objective-c ios core-data nsfetchrequest

我有一个类似于此的核心数据模型:

  • 公司实体
    • companyName属性(字符串)
    • 与员工实体的To-Many关系。
  • 员工实体
    • employeeID属性(字符串)
    • 与父公司实体的To-One关系

我有一个根视图控制器,它在表视图中列出了公司。然后选择一行将所选公司的索引推送到另一个视图控制器,该控制器在表中列出Employee。

- (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"];

这看起来正确插入数据库,我可以看到公司的外键ID插入到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 个答案:

答案 0 :(得分:1)

如果为实体生成类,则可以简单地处理。在XCode中编辑模型时,单击Cmd-N以创建新文件。选择左侧的iOS Cocoa Touch Class,然后选择右侧的Managed Object Class。点击Next,Next,Next,将为您生成代表您的实体的类文件。

这些类很金,因为它们可以帮助您管理对象之间的所有连接。在您的模型中,如果您定义从公司到员工的多对多关系并将其称为员工,那么您的公司类将具有employees属性,该属性是与该特定公司关联的所有员工的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
}