我有一个带有两个托管对象上下文设置的应用程序,如下所示:
- 父上下文:NSPrivateQueueConcurrencyType,链接到持久存储。
- 主上下文:NSMainQueueConcurrencyType,父上下文的子上下文。
当向主上下文插入一个新的托管对象时,我先保存主上下文,然后再保存父上下文,如下所示:
[context performBlockAndWait:^{
NSError * error = nil;
if (![context save: &error]) {
NSLog(@"Core Data save error %@, %@", error, [error userInfo]);
}
}];
[parentContext performBlock:^{
NSError *error = nil;
BOOL result = [parentContext save: &error];
if ( ! result ) {
NSLog( @"Core Data save error in parent context %@, %@", error, [error userInfo] );
}
}];
我的理解是,manage对象在第一次创建的时候,有一个临时的objectID
。然后保存主上下文,这个对象及其临时 ID 到达父上下文。然后保存父上下文。保存最后一个上下文时,父上下文中的临时 objectID
将转换为永久 objectID
。
所以:
- 永久对象 ID 是否会自动传回 到主要(子)上下文?
- 当我强制获取对象永久 ID 时
[NSManagedObjectContext obtainPermanentIDsForObjects:error:]
,然后后台应用程序,重新激活它,重新加载,使用主上下文的objectWithID:
获取对象,并访问属性,我得到"CoreData could not fulfill a fault for ...".
最佳答案
这是一个已知的错误,希望尽快修复,但一般来说,获得一个永久 ID 就足够了,前提是您在将数据保存到第一个 child 之前这样做,并且您只包括插入的对象:
[moc obtainPermanentIDsForObjects:moc.insertedObjects.allObjects error:&error]
在一些复杂的情况下,最好在创建实例后立即获得永久 ID,尤其是当您有复杂的关系时。
您如何以及何时调用 obtainPermanentIDsForObjects
?
我不关注有关应用程序崩溃的部分。也许更好的解释会有所帮助。
关于ios - 核心数据 : Do child contexts ever get permanent objectIDs for newly inserted objects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11990279/