ios NSBatchDeleteRequest不删除关系

70gysomp  于 2023-03-09  发布在  iOS
关注(0)|答案(3)|浏览(107)

我有一个问题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];

有什么办法解决吗?

bvjxkvbb

bvjxkvbb1#

你可以用[manageObjectContext reset];

hjqgdpho

hjqgdpho2#

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];
                }
            }];
        }];
    }
}];

运行批量删除时,关系将被删除或取消,但可能不会执行一组级联删除规则,也不会执行验证规则-使用任何批量更改请求时,由应用程序来确保数据完整性。
您的数据模型可能要求您发出多个删除请求,以防止相关对象成为孤立对象但仍然可以找到。例如,您可能需要第二次批量删除,以查找以前相关但现在关系为空的实体。此类请求的 predicate 可能如下所示:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"toMany.@count == 0"];
或者可以使用子查询等。

lhcgjxsq

lhcgjxsq3#

我认为最好的解决方案是首先删除对象图中的类别,从而使所有关系无效。
之后,您可以继续为新闻项使用NSBatchDeleteRequest
请记住,批处理请求将跳过对象图的所有完整性检查。

相关问题