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

时间:2015-04-03 10:19:00

标签: ios core-data nsmanagedobject nsmanagedobjectcontext

我在子上下文中插入了一个对象并获得了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 
}];

2 个答案:

答案 0 :(得分:0)

NSManagedObjectID执行后,尚未提交的新创建的NSManagedObject的{​​{1}}会发生变化。

这就是您在保存对象后无法使用save找到NSManagedObject的原因。

阅读Managed Object IDs and URIs

答案 1 :(得分:0)

新对象在保存到永久存储区时将获得新的NSManagedObjectID。在保存之前,您可以致电obtainPermanentIDsForObjects获取永久ID。

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