2010-02-04 65 views
20

我有兩個類A和B,從A到B(多個A對象可能引用相同的B)具有多對一的關係。問題是,如果A方的刪除規則是級聯,只有刪除了引用A的上一個或將刪除第一個時刪除了關聯的A時纔會刪除B.如果有關係,關係B方的刪除規則是Nullify。iPhone核心數據:通過多對一的關係級聯刪除

另外,我在覈心數據文檔中看到可選標誌在某些情況下很重要。但不清楚他們所闡明的關係與我的案例有何關係。他們在談論一個遏制案(B由A擁有),而我的案例是訂閱/協會(B與A有關)。

我可以簡單地在代碼中管理刪除programmaticaly,但希望允許Core Data在可能的情況下做正確的事情。但目前還不清楚我在尋找的垃圾收集語義在Core Data中是否受到支持。

有什麼建議嗎?

回答

14

我有同樣的目標,你顯然有(只要最後引用的一個被刪除刪除)。我花了比預期更長的時間纔得到這個權利。特別是因爲

  • 當時一個準備刪除,在的一對多關係可能尚未更新,所以你不能只算一個引用。
  • 請將isDeleted上一個似乎在-prepareForDeletion

這裏已經設置就是爲我工作,如果任何人的興趣(我將使用 < - >>員工因爲它更容易閱讀):

僱員

- (void)prepareForDeletion { 
    // Delete our department if we we're the last employee associated with it. 
    Department *department = self.department; 
    if (department && (department.isDeleted == NO)) { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isDeleted == NO"]; 
     NSSet *employees = [department.employees filteredSetUsingPredicate:predicate]; 

     if ([employees count] == 0) {   
      [self.managedObjectContext deleteObject:department]; 
     } 
    } 
} 

其他人建議將此邏輯放入-willSave部門。我更喜歡上述解決方案,因爲在某些情況下(例如在手動存儲遷移或數據導入期間),我實際上可能想要保存空白部門。

+0

只是一個建議...由於文檔不說,這是沒有必要的消息超級,它可能是一個好主意,做所以:[super prepareForDeletion] – 2016-02-05 15:29:36

0

這裏有一個斯威夫特4版本盧卡斯回答:

public override func prepareForDeletion() { 
    guard let department = department else { return } 

    if department.employees.filter({ !$0.isDeleted }).isEmpty { 
     managedObjectContext?.delete(department) 
    } 
}