2012-03-14 70 views
13

我對核心數據中關係的刪除規則如何工作有點模糊,至少超出了文檔中描述的簡單情況。核心數據刪除規則對多的關係,刪除時爲空

這些情況中的大多數以及我在這裏看到的大多數答案都使用了一種模型,其中一對多關係左側的對象「擁有」右側的對象:例如,一個PersonPhoneNumber s,並且如果你刪除了那個人,你刪除了他們所有的相關號碼。在那種情況下,解決方案是明確的:核心數據將處理一切爲了你,如果你設置像這樣的關係:

Person  --(cascade)-->> PhoneNumber 
PhoneNumber --(nullify)--> Person 

什麼我感興趣的是相反的:一個一對多的關係,其中「所有權」被顛倒過來。例如,我可能會擴展CoreDataBooks示例代碼以添加一個Author實體,以便在一個位置收集有關獨特作者的所有信息。 A Book有一位作者,但作者有很多書......但我們不關心我們沒有列出書籍的作者。因此,刪除Authorbooks關係不爲空是不允許的,並且刪除引用特定Author的最後Book應刪除該Author

我可以想像一對夫婦的方式來手動做到這一點...什麼我不知道的是:

  • 做核心數據有辦法至少做一些這種自動的,與關係刪除規則?
  • 是否有一個「規範」,首選的方式來處理這種情況?

回答

13

您可以在您的Book類中覆蓋prepareForDeletion並檢查作者是否有其他書籍。如果不是,您可以刪除作者。

- (void)prepareForDeletion { 
    Author *author = self.author; 
    if (author.books.count == 1) { // only the book itself 
     [self.managedObjectContext deleteObject:author]; 
    } 
} 

編輯:爲了防止作者刪除的書籍,你可以覆蓋validateForDelete甚至更​​好:不以作者的書籍擺在首位

+2

除非有其他事情發生,否則在作者的兩本書都被刪除的情況下,這似乎失敗了。我在相應的prepareForDeletion中打印出author.books.count的值,兩本書都是2。那麼作者永遠不會被刪除。 (類名更改爲匹配問題,但關係相同) – 2013-03-26 23:48:24

1

Rickstr調用DeleteObject,

檢查下面的關係來完成你的兩個標準。

  1. 作者 - (拒絕) - >>圖書

刪除其作者書籍的關係非空不應該被允許

DENY :如果在關係目標處至少有一個對象,則不能刪除源對象。

  1. 書 - (瀑布) - >作者

刪除最後一本書引用特定作者應刪除作者

您不能刪除作者,正如我們的第一條規則所說,如果有任何非空的圖書不應該被刪除。如果他們不存在,作者將被刪除。

我認爲理論上它應該工作。讓我知道,如果這有效或不。

+0

'作者 - (拒絕) - >>書籍是好的,但是書 - (Cascade) - > Author'會導致作者被刪除,只要第一個該作者的書被刪除。 (或者我或者我做錯了什麼。) – rickster 2012-10-11 05:07:22

+0

但是同一個作者與DENY的關係是正確的,所以理論上它不會被刪除,因爲他有另外一本書。 – 2012-11-02 03:05:09

1

與Tim的解決方案類似,您可以覆蓋作者NSManagedObject子類中的willSave方法。請注意,如果您確實使用Tim的解決方案,我強烈建議您過濾爲尚未刪除的圖書設置的圖書;這樣,如果您同時刪除作者的所有書籍,作者仍將被刪除。

- (void)willSave { 
    if (!self.isDeleted) { 
     NSPredicate *notDeletedPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary<NSString *,id> *bindings) { 
      return ![(NSManagedObject *)evaluatedObject isDeleted]; 
     }]; 
     NSSet *filteredBooks = [self.books filteredSetUsingPredicate:notDeletedPredicate]; 
     if (filteredBooks.count == 0) 
      [self.managedObjectContext deleteObject:self]; 
    } 
    [super willSave]; 
} 
相關問題