我的數據模型包含兩個實體:作者和書籍有一對多的關係(一個作者可能會寫幾本書)。是否可以在覈心數據中自動刪除未引用的對象?
假設只有兩本書和DB兩位作者如下:
- 教科書被分配給作者X
- 書B被分配給作者Ÿ
假設以下變更適用:
- B書被分配給新的作者Z.
結果:
- 作者的Y DB不過分存在無書。
我的問題:是否可以配置數據模型,以便像作者Y這樣的對象在沒有被任何書籍引用時自動刪除?
我的數據模型包含兩個實體:作者和書籍有一對多的關係(一個作者可能會寫幾本書)。是否可以在覈心數據中自動刪除未引用的對象?
假設只有兩本書和DB兩位作者如下:
假設以下變更適用:
結果:
我的問題:是否可以配置數據模型,以便像作者Y這樣的對象在沒有被任何書籍引用時自動刪除?
您需要手動確定「孤兒」書籍。
當你更新作者關係時,你可以檢查舊的Author
的書籍關係,看它是否還有書。
或者,您可以使用通知來確定NSManagedObjectContext
更改的時間:NSManagedObjectContextObjectsDidChangeNotification
。如果您註冊此通知,您可以檢查Author
對象的一些更改。看看那specific notification in the docs。
非常感謝。我猜想,關係完整性只能通過刪除規則自動執行。我會按照你的建議手動處理。 – Joshua 2012-02-13 12:40:22
查看「刪除傳播」。它正是爲了解決這個問題。
如果這並不完全符合您的要求:您可以覆蓋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
對象。如果一本書被刪除,核心數據將改變相應的作者對象的反向關係,因此錯誤的關係,使它不再是一個錯誤。代碼將只對這些對象進行操作。
你的數據是否在某個地方存在?如果是這樣,是關於如何從後臺自動刪除對象,或如何釋放內存的問題? – 2012-02-12 13:23:16
數據保存在SQLLite中,我希望從後端庫自動刪除這些對象。 – Joshua 2012-02-12 14:09:34
您是否嘗試將刪除傳播規則設置爲'cascade'?看到這個問題:http://stackoverflow.com/questions/2124022/how-to-properly-cascade-delete-managed-objects-in-core-data。 – Costique 2012-02-12 19:24:32