2

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

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...

根据文档,该mergeChangesFromRemoteContextSave行应该负责更新上下文,但这似乎没有发生。

还有一件事,我知道我可以设置project.images = nil并且这可以完成工作,但不能用于我只删除图像子集的情况。

编辑:我已经进一步调查并有更多信息。

出现故障时会出现此问题project.images。如果我强迫他们全部出错,那么在删除完成时关系将成功更新。如果我将它们留作故障,则关系不会受到影响,现在将指向不存在的对象。

4

1 回答 1

0

mergeChangesFromRemoteContextSave尝试包含NSUpdatedObjectsKey项目的objectID.

[NSManagedObjectContext mergeChangesFromRemoteContextSave:@{NSUpdatedObjectsKey : @[project.objectID], NSDeletedObjectsKey : [result result]} intoContexts:@[context]];`
于 2020-08-06T11:22:57.033 回答