嗨,大家好我有问题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];
Run Code Online (Sandbox Code Playgroud)
有关如何解决此问题的任何想法?
设置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];
                }
            }];
        }];
    }
}];
Run Code Online (Sandbox Code Playgroud)
当批量删除运行时,关系将被删除或无效,但可能不会执行级联的删除规则集,并且不会执行验证规则 - 由您的应用程序在使用任何批量更改时确保数据完整性要求。
您的数据模型可能要求您发出多个删除请求,以防止相关对象被孤立但仍可找到。例如,您可能需要第二批删除来定位以前相关但现在具有空关系的实体。此类请求的谓词可能如下所示:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"toMany.@count == 0"];
或者可以使用子查询等。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2370 次  |  
        
|   最近记录:  |