我有一个名为importMoc的内存托管对象上下文,用于导入记录(例如员工)。我已经解析了一个文件并在importMoc中设置了雇员对象,但有一个非常重要的例外。用户确认他们想要处理%d名员工,但我无法弄清楚如何或何时设置员工的“父母”关系(例如设置他们的部门)。
出于我的目的,他们都将被导入同一个部门(用户已经隐式选择)。
显然我不能在两种情境中建立关系,所以我:
这似乎是一个简单的问题,但出于某种原因(懒惰?疲倦?愚蠢?)我无法弄清楚如何去做!到目前为止,我所尝试的一切似乎都过于复杂和复杂!
提前致谢!
答案 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"];