NSBatchDeleteRequest不会删除关系

时间:2015-09-28 17:24:35

标签: ios core-data

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

我有两个实体:

  • 新闻
  • 分类

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

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

这里是删除功能:

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

有关如何解决这个问题的想法吗?

3 个答案:

答案 0 :(得分:3)

shouldDeleteInaccessibleFaults:设置为YES,将删除无法访问/无法填充的错误。这解决了当前的问题。

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<NSManagedObjectID *> *objectIDs = (NSArray<NSManagedObjectID *>)[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];
                }
            }];
        }];
    }
}];

当批量删除运行时,关系将被删除或无效,但可能无法执行级联的删除规则集,并且不会执行验证规则 - 应用程序需要确保数据完整性批量更改请求。

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

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

或者可以使用子查询等。

答案 1 :(得分:3)

你可以做[manageObjectContext reset];

答案 2 :(得分:0)

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

之后,您可以继续NSBatchDeleteRequest获取新闻。