NSBatchDeleteRequest留下不良关系

时间:2017-01-19 07:15:56

标签: ios objective-c core-data nsbatchdeleterequest

我有一个与Project有多对多关系的Image对象,删除规则设置为project.images的级联和image.project的Nullify。在这种情况下,我需要清除附加的图像,但保留项目本身。有很多图像,所以我想使用批量删除来一次性完成它们。

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Image"];
request.predicate = [NSPredicate predicateWithFormat:@"project = %@", project];
NSBatchDeleteRequest *delete = [[NSBatchDeleteRequest alloc] initWithFetchRequest:request];
delete.resultType = NSBatchDeleteResultTypeObjectIDs;
NSError *error;
NSBatchDeleteResult *result = [context.persistentStoreCoordinator executeRequest:delete withContext:context error:&error];
if (error) {
    // todo
}
[NSManagedObjectContext mergeChangesFromRemoteContextSave:@{NSDeletedObjectsKey : [result result]} intoContexts:@[context]];

NSLog(@"images: %@", project.images); // Still has all the images (they are now flagged as isDeleted)

[context save:&error];

NSLog(@"images: %@", project.images); // Still has all the images...

根据docsmergeChangesFromRemoteContextSave行应该注意更新上下文,但这似乎不会发生。

还有一件事,我知道我可以设置project.images = nil这可以完成这项工作,但在我只删除图像子集的情况下无法使用。

编辑:我进一步调查并获得更多信息。

project.images出现故障时会出现此问题。如果我强制它们全部出错,那么当删除通过时关系将成功更新。如果我将它们作为缺陷留下来,那么这种关系就会不受影响,现在将指向不存在的对象。

1 个答案:

答案 0 :(得分:0)

mergeChangesFromRemoteContextSave中,尝试将NSUpdatedObjectsKey包含在项目的objectID中。

[NSManagedObjectContext mergeChangesFromRemoteContextSave:@{NSUpdatedObjectsKey : @[project.objectID], NSDeletedObjectsKey : [result result]} intoContexts:@[context]];`