保存后在子上下文中创建的新对象在父上下文中不存在
New object created in child context doesn't exist in parent context after saving
我在子上下文中插入了一个对象并获得了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
}];
新创建的NSManagedObject
未提交的NSManagedObjectID
会在save
执行后发生变化
这就是您在保存对象后无法使用 objID
找到 NSManagedObject
的原因。
一个新的对象在保存到永久存储时会得到一个新的NSManagedObjectID。您可以在保存之前调用 obtainPermanentIDsForObjects
获取永久 ID。
[childContext obtainPermanentIDsForObjects:@[obj] error:&error];
NSManagedObjectID *objID = [obj ObjectID];
我在子上下文中插入了一个对象并获得了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
}];
新创建的NSManagedObject
未提交的NSManagedObjectID
会在save
执行后发生变化
这就是您在保存对象后无法使用 objID
找到 NSManagedObject
的原因。
一个新的对象在保存到永久存储时会得到一个新的NSManagedObjectID。您可以在保存之前调用 obtainPermanentIDsForObjects
获取永久 ID。
[childContext obtainPermanentIDsForObjects:@[obj] error:&error];
NSManagedObjectID *objID = [obj ObjectID];