Cocoa 导入核心数据时设置关系?

Cocoa 导入核心数据时设置关系?,cocoa,core-data,import,persistence,Cocoa,Core Data,Import,Persistence,我有一个名为importMoc的内存内托管对象上下文,用于导入记录(例如员工)。我已经解析了一个文件,并在importMoc中设置了employee对象,但有一个非常重要的异常。用户确认他们想要处理%d名员工,但我不太清楚如何或何时设置员工的“家长”关系(例如设置他们的部门) 出于我的目的,它们都将导入到同一个部门(用户已经隐式选择了该部门) 显然,我无法在这两个上下文中建立关系,因此我: 在importMoc中创建一个部门,然后在合并更改时将“导入”部门与“真实”部门合并 2) 合并员工,然后

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

出于我的目的,它们都将导入到同一个部门(用户已经隐式选择了该部门)

显然,我无法在这两个上下文中建立关系,因此我:

  • 在importMoc中创建一个部门,然后在合并更改时将“导入”部门与“真实”部门合并
  • 2) 合并员工,然后获取所有新导入的员工(不知何故!!!),然后设置他们的部门
  • 3) 我忽略的其他解决方案
  • 这似乎是一个简单的问题,但出于某种原因(懒惰?疲劳?愚蠢?),我不知道该怎么做!到目前为止,我尝试过的一切似乎都太复杂了


    提前谢谢

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

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

    3/创建引用在(2)处创建的对象的员工

    i、 e.(注意:仅示例代码,可能不会编译):


    如果
    部门
    对象已保存到持久存储中,则可以将它们放入另一个托管对象上下文中。由于您的对象无论如何都必须位于同一个持久存储中(因为不允许跨存储关系),因此您应该能够简单地将所需对象提取到
    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"];
    }
    

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

    谢谢diciu,但这并没有回答我关于在两个不同上下文之间建立关系的最佳方法的问题(如《核心数据编程指南-高效导入数据》中所建议的)。由于时间限制,我目前已停止使用第二个托管对象上下文进行导入,但我仍然很想知道正确的方法。我还发现了以下最近的问题,但提供的答案不是很令人满意:因此,阅读精细手册:如果我删除您说要忽略的谓词并调用[importMoc executeFetchRequest:error:],我将得到一个数组,其中包含已保存到持久存储中的所有管理器(例如)(无论其上下文如何)加上当前(importMoc)上下文中的所有管理器,无论它们是否已保存。我理解正确吗?正确。只有当对象在内存中时,上下文才起作用。一旦它们被保存到持久性存储中,它们就可以被提取到任何上下文中。只需一个简短的便条,就可以对Alex的回答表示非常感谢。我没有意识到,如果fetch具有相同的持久存储协调器,那么它会将对象添加到单独的上下文中。我也有同样的问题,这个答案对我来说很有用!
    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"];
    }