ios – NSBatchDeleteRequest不会删除关系

嗨伙计们,我遇到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];

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

解决方法

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

WWDC 2015会议核心数据的新内容对此进行了一些讨论. NSBatchDeleteRequest和NSBatchUpdateRequest都修改了持久存储而没有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”];

或者可以使用子查询等.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...