2015-09-28 59 views
5

嗨,大家好我有一個問題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]; 

關於如何解決此問題的任何想法?

+0

你使用的是什麼刪除規則? – Shizam

+0

@Shizam我正在使用Nullify – Serluca

+0

有多少條記錄?少於10,000?你也可以使用對象圖。 – Mundi

回答

4

shouldDeleteInaccessibleFaults:設置爲YES並且無法訪問/無法實現的錯誤將被刪除。這解決了眼前的問題。

WWDC 2015會議Core Data有什麼新消息就這一點進行了討論。 NSBatchDeleteRequestNSBatchUpdateRequest都會修改持久性存儲而不需要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"];

,或者可以使用子查詢等

+0

不幸的是@quellish不起作用,我在刷新批處理之後刷新上下文中調用refreshAllObjects的上下文。我知道這取決於應用程序,但如果我刪除兩個實體,我沒有任何參考,然後刪除關係 – Serluca

+0

似乎有必要設置: 'batchDeleteRequest.resultType = NSBatchDeleteResultTypeObjectIDs' 爲此工作,否則result.result默認爲狀態,即成功/失敗。 –

0

我認爲最好的解決辦法可能是在對象圖首先刪除類別,從而抵消所有的關係。

之後,您可以繼續爲新聞項目NSBatchDeleteRequest

3

你也許可以做[manageObjectContext reset];