將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