导入核心数据时建立关系?

时间:2009-10-20 03:05:28

标签: cocoa core-data import persistence

我有一个名为importMoc的内存托管对象上下文,用于导入记录(例如员工)。我已经解析了一个文件并在importMoc中设置了雇员对象,但有一个非常重要的例外。用户确认他们想要处理%d名员工,但我无法弄清楚如何或何时设置员工的“父母”关系(例如设置他们的部门)。

出于我的目的,他们都将被导入同一个部门(用户已经隐式选择)。

显然我不能在两种情境中建立关系,所以我:

  1. 在importMoc中创建一个部门,然后当我合并更改时,将“导入”部门与“真实”部门合并?
  2. 2)合并员工,然后获取所有刚刚进口的员工(不知何故!!!)然后设置他们的部门?
  3. 3)我忽略了其他一些解决方案?

这似乎是一个简单的问题,但出于某种原因(懒惰?疲倦?愚蠢?)我无法弄清楚如何去做!到目前为止,我所尝试的一切似乎都过于复杂和复杂!

提前致谢!

2 个答案:

答案 0 :(得分:4)

如果Department对象已保存到持久性存储,则可以将它们带入另一个托管对象上下文。由于您的对象无论如何都必须存在于同一个持久性存储中(因为不允许跨存储关系),您应该能够将所需的对象简单地提取到importMoc

例如:

foreach (NSDictionary *record in employeeRecords) {
    NSManagedObject *employee = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:importMoc];
    // Configure employee however you do that

    NSString *managerID = [record objectForKey:@"someKeyThatUniquelyIdentifiesTheManager"];
    NSFetchRequest *managerFetchRequest = [[NSFetchRequest alloc] init];
    [managerFetchRequest setEntity:[NSEntity entityForName:@"Manager" inManagedObjectContext:importMoc]];
    [managerFetchRequest setPredicate:[NSPredicate predicateWithFormat:@"managerProperty == %@", managerID]];
    NSArray *managers = [importMoc executeFetchRequest:managerFetchRequest error:nil]; // Don't be stupid like me and catch the error ;-)
    [managerFetchRequest release];

    if ([managers count] != 1) {
        // You probably have problems if this happens
    }

    [employee setValue:[managers objectAtIndex:0] forKey:@"manager"];
}

您也可以只执行一次获取请求,将所有管理员放入importMoc,然后过滤该数组,每次都找到正确的数组。这可能会更有效率。换句话说,不要做我刚才告诉你的事情: - )

答案 1 :(得分:0)

1 /假设员工记录X的名称为Y,部门ID为15(即通过关系引用ID为15的部门)

2 /从托管对象上下文加载部门ID为15的部门

3 /创建一个引用在(2)

创建的对象的员工

即。 (注意:仅示例代码,可能无法编译):

NSEntityDescription * departmentED = [NSEntityDescription entityForName:@"Department" inManagedObjectContext:moc];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(id == %@)", deptId];

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:departmentED];
[request setPredicate:predicate];

NSError *error = nil;
NSArray *array = [moc executeFetchRequest:request error:&error];

/* create employee */

NSEntityDescription * employeeED = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:moc];
NSManagedObject * employeeMO = [[[NSManagedObject alloc] initWithEntity:employeeED insertIntoManagedObjectContext:moc] autorelease];

/* set employee department to department instance loaded above */
[receiptObject setValue:[array objectAtIndex:0] forKey:@"department"];