1

我有一個Person實體,它屬於一對多關係的Department只有在沒有關係的情況下才能正確處理刪除對象?

我希望能夠刪除Department當它存在(無論是通過缺失Person實體,或者更改了Persondepartment屬性)關聯不多Person秒。現在,我想用下面的處理程序NSManagedObjectContextObjectsDidChangeNotification這樣做(目前只是想看到的缺失,並適當刪除):

- (void)managedObjectDidChange:(NSNotification *)notification { 

    NSSet *updatedObjects = [[notification userInfo] objectForKey:NSDeletedObjectsKey]; 
    for (NSManagedObject *obj in updatedObjects) { 
     if ([obj.entity.name isEqualToString:@"Person"]) { 
      NSLog(@"Person Changed"); 

      NSManagedObject *department = [(Person *)obj department]; 
      NSLog(@"%i", [[department valueForKey:@"person"] count]); 

      if ([[department] valueForKey:@"person"] count] == 0) { 
       NSLog(@"Department has no more people associated with it"); 
       // deletion code 
      } 
     } 
    } 
} 

然而,與部門沒有按相關的人數的計數當我刪除一個人時不會改變。我沒有對Department實體執行提取操作。那是我應該做的事嗎?

+0

您是否在刪除`Person`對象後保存上下文? – Rog 2011-02-13 06:23:31

+0

是的,我刪除了`Person`,保存了上下文,當我'NSLog`與`Department`關聯的`Person`對象的計數時,沒有任何變化。 – 2011-02-14 01:06:58

回答

9

最簡單的方法:在你的部門的實體類實現willSave(?你給每個實體自己的類,右*),讓您的檢查部門本身[self isDeleted] == NO[[self person] count] == 0,如果是刪除自身。 (isDeleted的檢查不是可選的,因爲在willSave內部更改自身的實體會觸發另一個對willSave的調用.的文檔有更多信息。)這會推遲刪除,直到上下文刷新到磁盤,而這不應該是一個巨大的問題。

如果您確實需要部門在最後一個人離開時立即刪除自己,請讓您的部門實體使用KVO觀察自己。將其註冊爲awakeFromFetchawakeFromInsert中的自己的「人物」屬性的觀察者,並在willTurnIntoFault中取消註冊。當人物屬性發生變化時,請檢查它是否爲空。這是更多的工作,所以只有在第一種方式不適合你的情況下才能嘗試。最後,請記住Person-> Department關係刪除規則需要設置爲'nullify'(當Person被刪除時,它會從Department的人員中刪除),而不是'沒有任何操作'(當Person被刪除時,你採取清理部門自己)或「級聯」的責任(如任何人被刪除,其部也被刪除!)

(* MOGenerator是一個非常好的幫手維護每個實體類。http://rentzsch.github.com/mogenerator/

2

在您的Person子類中,覆蓋prepareForDeletion。如果Department只剩下一個person,則也應刪除Department。 Apple的文檔甚至建議使用prepareForDeletion作爲自定義刪除傳播的最佳位置。

- (void)prepareForDeletion 
{ 
    [super prepareForDeletion]; 

    if (self.department.persons.count == 1) { 
     [self.managedObjectContext deleteObject:self.department]; 
    } 
} 
相關問題