将shouldDeleteInaccessibleFaults:
设置为YES
并且无法访问/无法实现的错误将被删除。这解决了眼前的问题。
WWDC 2015会议Core Data有什么新消息就这一点进行了讨论。 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:@"[email protected] == 0"];
,或者可以使用子查询等
你使用的是什么删除规则? – Shizam
@Shizam我正在使用Nullify – Serluca
有多少条记录?少于10,000?你也可以使用对象图。 – Mundi