【问题标题】:NSBatchDeleteRequest does not delete relationshipNSBatchDeleteRequest 不删除关系
【发布时间】:2015-09-28 17:24:35
【问题描述】:

我对@9​​87654321@ 有疑问,似乎无法删除关系引用。

我有两个实体:

  • 新闻
  • 类别

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

现在,当我尝试使用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];

知道如何解决这个问题吗?

【问题讨论】:

  • 你使用的是什么删除规则?
  • @Shizam 我正在使用 Nullify
  • 有多少条记录?少于 10.000?您不妨使用对象图。
  • @Mundi 很多,现在该应用程序需要 6 分钟才能使用对象图注销。
  • 这听起来不对。您可能在循环中保存或最后只保存一次。您需要正确设置批量大小。

标签: ios core-data


【解决方案1】:

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

WWDC 2015 会议 What's New in Core Data 谈到了这一点。 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"];

或者可以使用子查询等

【讨论】:

  • 嗨@quellish 不幸的是不起作用,我在删除批处理后刷新上下文中调用 refreshAllObjects 的对象。我知道这取决于应用程序,但如果我删除两个实体,我没有任何参考,然后删除关系
  • 似乎有必要设置:batchDeleteRequest.resultType = NSBatchDeleteResultTypeObjectIDs 才能工作,否则 result.result 默认为状态,即成功/失败。
【解决方案2】:

你可能可以做到[manageObjectContext reset];

【讨论】:

    【解决方案3】:

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

    之后,您可以继续使用 NSBatchDeleteRequest 获取新闻项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 2021-01-05
      • 2020-08-02
      • 2021-04-29
      • 2013-10-20
      相关资源
      最近更新 更多