2012-02-12 42 views
1

我的數據模型包含兩個實體:作者和書籍有一對多的關係(一個作者可能會寫幾本書)。是否可以在覈心數據中自動刪除未引用的對象?

假設只有兩本書和DB兩位作者如下:

  • 教科書被分配給作者X
  • 書B被分配給作者Ÿ

假設以下變更適用:

  • B書被分配給新的作者Z.

結果:

  • 作者的Y DB不過分存在無書。

我的問題:是否可以配置數據模型,以便像作者Y這樣的對象在沒有被任何書籍引用時自動刪除?

+0

你的數據是否在某個地方存在?如果是這樣,是關於如何從後臺自動刪除對象,或如何釋放內存的問題? – 2012-02-12 13:23:16

+0

數據保存在SQLLite中,我希望從後端庫自動刪除這些對象。 – Joshua 2012-02-12 14:09:34

+0

您是否嘗試將刪除傳播規則設置爲'cascade'?看到這個問題:http://stackoverflow.com/questions/2124022/how-to-properly-cascade-delete-managed-objects-in-core-data。 – Costique 2012-02-12 19:24:32

回答

1

您需要手動確定「孤兒」書籍。

當你更新作者關係時,你可以檢查舊的Author的書籍關係,看它是否還有書。

或者,您可以使用通知來確定NSManagedObjectContext更改的時間:NSManagedObjectContextObjectsDidChangeNotification。如果您註冊此通知,您可以檢查Author對象的一些更改。看看那specific notification in the docs

+0

非常感謝。我猜想,關係完整性只能通過刪除規則自動執行。我會按照你的建議手動處理。 – Joshua 2012-02-13 12:40:22

2

查看「刪除傳播」。它正是爲了解決這個問題。

如果這並不完全符合您的要求:您可以覆蓋Book實體上的- (void)prepareForDeletion,並在此處檢查任何已註冊上下文並具有掛起更改的作者(因爲它們的反轉將發生更改),並沒有書:

{ 
    // ... 
    [[NSNotificationCenter defaultNotificationCenter] addObserver:self selector:@selector(deleteOrphanedAuthors:) name:NSManagedObjectContext object:moc]; 
    // ... 
} 

- (void)deleteOrphanedAuthors:(NSNotification *)note; 
{ 
    NSManagedObjectContext *moc = [note object]; 
    NSManagedObjectModel *mom = [[moc persistentStoreCoordinator] managedObjectModel]; 
    NSEntityDescription *authorEntity = [[mom entitiesByName] objectForKey:@"Author"]; 
    for (NSManagedObject *author in [moc updatedObjects]) { 
     if ([author entity] == authorEntity) { 
      if (![author hasFaultForRelationshipNamed:@"books"] && ([[author books] count] == 0)) { 
       [moc deleteObject:author]; 
      } 
     } 
    } 
} 

注:您可以nil爲對象(即上下文)來觀察,因爲你使用的框架,可以有自己的背景,你不想惹他們。

此外,請注意如果此代碼存在錯誤,請仔細閱讀該代碼以避免觸摸author對象。如果一本書被刪除,核心數據將改變相應的作者對象的反向關係,因此錯誤的關係,使它不再是一個錯誤。代碼將只對這些對象進行操作。

+0

感謝您的詳細回覆。我認爲prepareForDeletion不會被調用,因爲沒有對象被刪除。我的方案是將書籍分配給不同的作者,因此沒有理由刪除規則將接管。 – Joshua 2012-02-13 12:37:49

+0

哦,我錯過了那部分。你可以做類似的事情。註冊NSManagedObjectContextObjectsDidChange並在那裏做同樣的事情。我已經更新了回覆。 – 2012-02-13 17:28:49

+0

謝謝你,偉大的代碼示例! – Joshua 2012-02-13 21:58:47

相關問題