我在主队列中有一个父NSmanagedObjectContext
,在一个私有队列中有一个子NSManagedObjectContext
。我将父上下文中的一组托管对象传递给它的子对象。然后,子上下文具有来自其父对象的托管对象,然后插入新的托管对象。我在私有队列中对子上下文中的所有托管对象进行了一些处理,这些托管对象来自父级和它自己的新对象,并且在进程结束时,我需要告诉父级:
是否可以在上下文之间使用父/子关系?即使他们属于不同的队列?或者是父/子关系仅适用于执行某些托管对象的属性更改,但它不适用于托管对象的删除和插入?
如果无法使用父/子关系管理此方案,那么方法应该是什么?
提前致谢
编辑:我发现的示例只是使用子上下文来编辑父项的托管对象,然后在编辑结束时将更改应用于父项。所以我不确定是否可以使用子上下文来删除或插入父对象。
答案 0 :(得分:1)
当子上下文调用save()
时,更改将被推送到父上下文。这意味着,更新父上下文的整个对象图以反映子上下文的状态。
因此,您无需做任何事情。删除的对象将消失,添加的对象将在那里,编辑的对象将被更新。
答案 1 :(得分:0)
这是一个代码片段(缺少一些块),它执行基于子项的删除,然后将其传递给父项。
[childContext performBlock:^{
// query array of messages
// LOTS OF CODE
// Loop through them and delete each message
// Loop through each message
for (id emptyMessage in emptyMessages) {
i++;
// Work in ContextBlocks...
// [childContext performBlock:^{
__block AHRSMessage *msg = (AHRSMessage *) [childContext objectWithID:emptyMessage];
[childContext deleteObject:msg];
if (i % modFactor == 0) {
self.percentDone = i / totalRecords;
NSLog(@"%.1f Saving ...", self.percentDone * 100);
NSError *error;
if (![childContext save:&error]) {
NSLog(@"\n error => %@ \n", [error localizedDescription]);
NSLog(@" error => %@ ", [error userInfo]);
[NSException raise:@"Database Write Error" format:@"%@ %@", [error localizedDescription], [error userInfo]];
// abort();
}
[parentContext performBlock:^{
NSError *errrror;
if (![parentContext save:&errrror]) {
NSLog(@"\n error => %@ \n", [error localizedDescription]);
NSLog(@" error => %@ ", [error userInfo]);
[NSException raise:@"Database Write Error" format:@"%@ %@", [error localizedDescription], [error userInfo]];
// abort();
}
}];
}
// }];
}
子保存将其写入内存并实际写入磁盘,您必须调用父保存。如你所见,我一个接一个地做 - 但这不是必需的。