嵌套的NSManagedObjectContext save和objectID

Ron*_*iew 6 core-data objective-c ios5

childContext和parentContext都是"NSMainQueueConcurrencyType"

[childContext performBlock:^(void) {
  [childContext save:NULL];

  [parentContext performBlock:^(void) {
    [parentContext save:NULL];
    // Why is objectID for the inserted NSManagedObject still a temporary one here?
  }];
}];
Run Code Online (Sandbox Code Playgroud)

题:

  1. 这是保存子和父上下文的正确方法
  2. 为什么保存后,插入的NSManagedObject的objectID仍然是临时的?

Jod*_*ins 3

我可以想到一些罕见的情况,您希望将一个主队列 MOC 作为另一个主队列 MOC 的子级,但是看到这一点肯定让我问:让它们都是 NSMainQueueConcurrencyType 有什么好处?

此外,这是一个已知的错误(至少已被报告多次)。当您从子上下文插入和保存时,只有直接连接到持久存储的那个上下文的 ID 才会发生变化。因此,在保存新插入的项目时,您有多种选择。

  1. 保存前获取持久 ID。
  2. 调用[moc refreshObject:object mergeChanges:NO]并将所有引用设置为零。
  3. 在大多数父保存后获取持久 ID

我更喜欢#3,因为它需要深入数据库。如果你之后这样做,它可以从父母那里得到它们。