NSBatchDeleteRequest 留下不好的关系

Posted

技术标签:

【中文标题】NSBatchDeleteRequest 留下不好的关系【英文标题】:NSBatchDeleteRequest leaving bad relationships 【发布时间】:2017-01-19 07:15:56 【问题描述】:

我有一个与Image 有一对多关系的Project 对象,删除规则设置为project.images 的级联和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...

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

还有一件事,我知道我可以设置 project.images = nil,这样就可以了,但不能用于我只删除图像子集的情况。

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

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

【问题讨论】:

见here。 对该答案的第一条评论说它不起作用 【参考方案1】:

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

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

【讨论】:

以上是关于NSBatchDeleteRequest 留下不好的关系的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 NSBatchDeleteRequest 的 NSBatchDeleteResult 类型?

UI 在执行 NSBatchDeleteRequest 时冻结

如何让 NSBatchDeleteRequest 删除并允许您再次添加回对象

在 NSBatchDeleteRequest 之后使用核心数据

核心数据 NSBatchDeleteRequest 似乎将对象留在上下文中

Rails:留下很多代码