1

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

  • 公司实体
    • companyName 属性(字符串)
    • 与 Employee 实体的多对多关系。
  • 员工实体
    • 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"];

这看起来正确插入了数据库,我可以看到 Company 的外键 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];
4

1 回答 1

1

如果您为实体生成类,这可以简单地处理。在 XCode 中编辑模型时,点击 Cmd-N 创建一个新文件。在左侧选择 iOS Cocoa Touch Class,在右侧选择 Managed Object Class。Hit 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
}
于 2011-02-05T00:30:14.410 回答