2015-04-03 58 views
0

我在子上下文中插入了一個對象並獲得了對象ID,然後我保存了子上下文和父上下文。現在我想通過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 
}]; 

回答

0

新對象將獲得一個新的NSManagedObjectID當它被保存到永久存儲。保存之前,您可以撥打obtainPermanentIDsForObjects以獲得永久ID。

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

的一個新創建的NSManagedObject尚未犯下的save後會改變NSManagedObjectID執行。

這就是您在保存對象後無法使用objID找到NSManagedObject的原因。

Managed Object IDs and URIs

+0

感謝您的回覆,但我在通過objectID獲取對象之前保存了childContext和parentContext,您可以檢查我的代碼。 – 2015-04-03 11:05:59

+0

是的,這就是爲什麼'objID'的值會因爲執行了'if(![childContext save:&error])而改變的原因{NSKLog(@「%@」,error); }'。移動'NSManagedObjectID * objID = [obj ObjectID];'在你獲取並嘗試的行的上方。 – Apoorv 2015-04-03 11:09:32

+0

我已經更新了我的問題,那是什麼意思?如果是這樣,它仍然不起作用....事實上,我可以用childContext但parentContext獲取對象。 – 2015-04-03 11:22:52

相關問題