保存后在子上下文中创建的新对象在父上下文中不存在

Posted

技术标签:

【中文标题】保存后在子上下文中创建的新对象在父上下文中不存在【英文标题】:New object created in child context doesn't exist in parent context after saving 【发布时间】:2015-04-03 10:18:59 【问题描述】:

我在子上下文中插入了一个对象并获得了 objectID,然后我保存了子上下文和父上下文。现在想通过objectID获取对象,但是只能通过子上下文获取,而父上下文获取,为什么?

...
NSManagedObjectContext *childContext = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease];
childContext.parentContext = self.parentContext;
[childContext performBlock:^
    NSManagedObject *obj = [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:childContext];

    if (![childContext save:&error]) 
        NSLog(@"%@", error);
    

    [self.parentContext performBlockAndWait:^
        if (![self.parentContext save:&error]) 
            NSLog(@"%@", error);
        
    ];

    NSManagedObjectID *objID = [obj ObjectID];
    NSManagedObject *objTmp = [self.parentContext existingObjectWithID:objID error:&error];
    // Why objTmp is nil here?

    NSManagedObjectID *objIDTmp = [[[self.parentContext executeFetchRequest...] objectatindex:0] objectID];
    // objIDTmp is different from objID 
];

【问题讨论】:

【参考方案1】:

新对象在保存到永久存储时将获得一个新的 NSManagedObjectID。您可以致电obtainPermanentIDsForObjects 获取永久ID,然后再保存。

[childContext obtainPermanentIDsForObjects:@[obj] error:&error];
NSManagedObjectID *objID = [obj ObjectID];

【讨论】:

【参考方案2】:

新创建的尚未提交的NSManagedObjectNSManagedObjectIDsave执行后会发生变化。

这就是保存对象后使用objID 找不到NSManagedObject 的原因。

阅读Managed Object IDs and URIs

【讨论】:

感谢您的回复,但是我在通过objectID获取对象之前确实保存了childContext和parentContext,您可以查看我的代码。 是的,这就是为什么objID 的值会改变,因为您执行了if (![childContext save:&error]) NSLog(@"%@", error); 。将NSManagedObjectID *objID = [obj ObjectID]; 移动到您获取它的行上方并尝试。 我已经更新了我的问题,这是你的意思吗?如果是这样,它仍然不起作用....事实上,我可以使用 childContext 但 parentContext 获取对象。 嗨 Apoorv,我有一些发现,请查看我的最新问题。保存上下文后,我使用 parentContext 获取对象,并获得正确的 objectID,这意味着我无法通过我创建的对象获得正确的 objectID,即使在保存之后也是如此。那么你知道如何处理这个问题,因为我不想保存后重新获取...... 为什么不能使用obj 本身?

以上是关于保存后在子上下文中创建的新对象在父上下文中不存在的主要内容,如果未能解决你的问题,请参考以下文章

C#:当前上下文中不存在名称“Launch”[重复]

MVC项目在上下文中不存在。怎么了?

当前上下文中不存在名称“资产”

当前上下文中不存在名称

CS0103:当前上下文中不存在名称“ClassName”

Core Data 使用多个上下文中的新对象从后台线程订购一对多关系保存