2012-01-03 83 views
3

我的數據庫有3個實體:照片,地點(拍攝照片的地方)和標籤(照片)。核心數據刪除規則

database

的每張照片都在其中已經採取了地方的關係。 每個地方都有一組照片。

每張照片都有一組標籤,每個標籤都有一組照片。這是一種多對多的關係,因爲單張照片可以有多個標籤,並且標籤可以與多張照片相關聯。現在

,我無法找出正確的刪除規則,這種行爲:

  • 我想直接刪除照片只有實體。
  • 如果相關的地方有其他照片,它不應該被刪除。如果照片是該地點的最後一張照片,則應刪除照片。
  • 它的相關標籤出現在其他照片中,不應刪除,直到沒有其他照片關聯爲止。
  • 此外,在標籤實體中,我有一個屬性可以跟蹤與其相關聯的照片數量(當我添加新照片並且還在照片的prepareForDeletion中時,我更新此屬性)。

有什麼建議嗎?

回答

1

所以,謝謝馬庫斯,我已經將所有的刪除規則Nullify,然後我寫在照片的prepareForDeletion驗證碼:

- (void)prepareForDeletion 
{  
    //tag check: if this photo was the last associated with that tag, deletion !! 
    for (Tag *tag in self.tags) { 
     if ([tag.taggedPhotos count] == 1) { 
      [self.managedObjectContext deleteObject:tag]; 
     } else { 
      tag.photoCount = [NSNumber numberWithInt:[tag.photoCount intValue]-1]; 
     } 
    } 

    //place check: if this photo was the last associated with that place, deletion !! 
    if ([self.whereTaken.photos count] == 1) { 
     [self.managedObjectContext deleteObject:self.whereTaken]; 
    } 
} 

我沒有刪除的numberOfPhotosTagged屬性,因爲我」用它來排序標籤。

2

首先,標籤不應該需要單獨的屬性來跟蹤照片的數量。您可以查詢該計數的關係。其次,您需要在Photo實體中設置一個-prepareForDeletion,該實體檢查是否是唯一帶有對該標記的引用的照片,如果是,則刪除它。

同樣,當您刪除照片時,您可以在其-prepareForDeletion中查看該照片中有多少照片並調用相同的邏輯。

在模型本身,我會設置刪除規則爲無效。

+0

我用了「numberOfPhotosTagged」屬性進行排序標籤(最常用的第一)。這是那種描述: [NSSortDescriptor sortDescriptorWithKey:@「numberOfPhotosTagged」上升:NO] – Ciampo 2012-01-03 19:43:34

+0

啊,你應該能夠使用'標籤.count'作爲一個排序描述符,而不必保持同步值。沒有測試,所以沒有保證,但它*應*工作。 – 2012-01-03 19:45:09

+0

因爲我在排序標籤,我用'[NSSortDescriptor sortDescriptorWithKey:@「taggedPhotos。@ count'ascending:NO]',但程序結束白衣這個錯誤:'關鍵路徑包含KVC聚合,不應該有一個;無法處理標記的照片。@ count' – Ciampo 2012-01-04 08:31:01