NSBatchDeleteRequest不会删除关系

嗨伙计们,我遇到NSBatchDeleteRequest的问题,似乎无法删除关系引用。

我有两个实体:

  • 新闻
  • 分类

一个类别可以有多个新闻。

现在,当我尝试使用带有以下代码的NSBatchDeleteRequest删除核心数据中的所有对象时,然后查看sqlite文件似乎删除了所有类别,删除了所有新闻,但类别和新闻之间的关系仍然存在,而这导致错误。

这里的删除function:

 NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:entityName]; NSBatchDeleteRequest *delete = [[NSBatchDeleteRequest alloc] initWithFetchRequest:fetchRequest]; [delete setResultType:NSBatchDeleteResultTypeCount]; NSError *error; NSBatchDeleteResult *results = [deleteContext executeRequest:delete error:&error]; 

有关如何解决此问题的任何想法?

shouldDeleteInaccessibleFaults:设置为YES ,将删除不可访问/无法shouldDeleteInaccessibleFaults:故障。 这解决了当前的问题。

WWDC 2015会议核心数据的新内容对此进行了一些讨论。 NSBatchDeleteRequestNSBatchUpdateRequest修改了持久存储而没有NSManagedObjectContext的参与 – 这将导致上下文的数据视图与存储不一致。

需要在NSManagedObjectContext更新已删除对象的内存中副本 – 让批量删除请求返回已删除对象的对象ID,并告知NSManagedObjectContext刷新这些ID。

这看起来像这样:

 [managedObjectContext performBlock:^{ NSBatchDeleteRequest batchDeleteRequest = [NSBatchDeleteRequest alloc] initWithFetchRequest:fetchRequest]; NSBatchDeleteResult result = nil; result = [managedObjectContext executeRequest:batchDeleteRequest error:&error]; if ([[result result] count] > 0){ [managedObjectContext performBlock:^{ NSArray *objectIDs = (NSArray)[result result]; [objectIDs enumerateObjectsUsingBlock:^(NSManagedObjectID *objID, NSUInteger idx, BOOL *stop) { NSError *error = nil; NSManagedObject *obj = [managedObjectContext existingObjectWithID:objID error:&error]; if (![obj isFault] ) { [managedObjectContext refreshObject:obj mergeChanges:YES]; } }]; }]; } }]; 

当批量删除运行时,关系将被删除或无效,但是可能无法执行级联的删除规则集,并且不会执行validation规则 – 在使用任何批量更改时,应由您的应用程序确保数据完整性要求。

您的数据模型可能要求您发出多个删除请求,以防止相关对象被孤立但仍可查找。 例如,您可能需要第二次批量删除以查找以前具有空关系的先前相关实体。 此类请求的谓词可能如下所示:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"toMany.@count == 0"];

或者可以使用子查询等。

你可以做[manageObjectContext reset];

我认为最好的解决方案可能是首先删除对象图中的类别,从而使所有关系无效。

之后,您可以继续处理新闻项目的NSBatchDeleteRequest