如何"tell" 一个管理对象的父上下文必须删除and/or 插入?
How to "tell" a parent context which managed objects it has to delete and/or insert?
我在主队列中有一个父 NSmanagedObjectContext
,在专用队列中有一个子 NSManagedObjectContext
。我将父上下文中的一组托管对象传递给它的子上下文。然后,子上下文从其父上下文中获得托管对象,然后插入新的托管对象。我在私有队列中对子上下文中的所有托管对象进行了一些处理,这些对象来自父对象和它自己的新对象,在过程结束时,我需要告诉父对象:
- 它的哪些管理对象需要删除
- 它的哪些托管对象需要替换为child中的新托管对象
- 子中的哪些托管对象需要插入到父中
是否可以通过上下文之间的 parent/child 关系来做到这一点?即使他们属于不同的队列?还是parent/child关系只适合对某些托管对象的属性进行更改,而不适合对托管对象进行删除和插入?
如果无法通过 parent/child 关系来管理这种情况,应该采用什么方法?
提前致谢
编辑: 我找到的示例只是使用子上下文来编辑父对象的托管对象,然后在版本结束时将更改应用到父对象。所以我不确定是否可以使用子上下文在父上下文中删除或插入对象。
当子上下文调用 save()
时,更改会向上推送到父上下文。这意味着,更新父上下文的整个对象图以反映子上下文的状态。
因此您无需执行任何操作。删除的对象会消失,添加的对象会在,编辑的对象会更新。
这是一个代码片段(缺少一些块),它执行基于子项的删除,然后将其传递给父项。
[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();
}
}];
}
// }];
}
子保存将其写入内存,要实际写入磁盘,您必须调用父保存。如您所见,我一个接一个地做 - 但这不是必需的。
我在主队列中有一个父 NSmanagedObjectContext
,在专用队列中有一个子 NSManagedObjectContext
。我将父上下文中的一组托管对象传递给它的子上下文。然后,子上下文从其父上下文中获得托管对象,然后插入新的托管对象。我在私有队列中对子上下文中的所有托管对象进行了一些处理,这些对象来自父对象和它自己的新对象,在过程结束时,我需要告诉父对象:
- 它的哪些管理对象需要删除
- 它的哪些托管对象需要替换为child中的新托管对象
- 子中的哪些托管对象需要插入到父中
是否可以通过上下文之间的 parent/child 关系来做到这一点?即使他们属于不同的队列?还是parent/child关系只适合对某些托管对象的属性进行更改,而不适合对托管对象进行删除和插入?
如果无法通过 parent/child 关系来管理这种情况,应该采用什么方法?
提前致谢
编辑: 我找到的示例只是使用子上下文来编辑父对象的托管对象,然后在版本结束时将更改应用到父对象。所以我不确定是否可以使用子上下文在父上下文中删除或插入对象。
当子上下文调用 save()
时,更改会向上推送到父上下文。这意味着,更新父上下文的整个对象图以反映子上下文的状态。
因此您无需执行任何操作。删除的对象会消失,添加的对象会在,编辑的对象会更新。
这是一个代码片段(缺少一些块),它执行基于子项的删除,然后将其传递给父项。
[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();
}
}];
}
// }];
}
子保存将其写入内存,要实际写入磁盘,您必须调用父保存。如您所见,我一个接一个地做 - 但这不是必需的。