嗨,伙计我遇到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];
有关如何解决这个问题的想法吗?
答案 0 :(得分:3)
将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"];
或者可以使用子查询等。
答案 1 :(得分:3)
你可以做[manageObjectContext reset];
答案 2 :(得分:0)
我认为最好的解决方案可能是首先删除对象图中的类别,从而使所有关系无效。
之后,您可以继续NSBatchDeleteRequest
获取新闻。