我目前正在開發iPhone的第一個Core Data項目。經過一些實驗後,我對核心數據中的實體關係有一些相當根本的問題。如何在關係變空時刪除託管對象
假設我有兩個實體:事件和位置。他們每個人都有一個名字屬性。事件只能有一個位置,而位置可以有多個事件。因此,關係是這樣的:
Event <<--> Location
在我的項目我(用戶)可以輸入的事件和地點的名稱。然後,我將根據該輸入爲Event實體創建一個新對象。我通過訪問事件的關係來設置位置的名稱,如下所示:
event.Location.name = someCustomString;
保存功能可以正常工作。我認爲。
我的第一個問題是:
確實核心數據創建的地點實體的新對象每次我這樣做的時候 - 即使在同一地點的名稱已經被使用過(並仍存儲)?或者在這種情況下Core Location自動只設置與現有Location對象的關係?因爲我的項目有必要識別發生在同一地點的事件。
這也使我對我的下一個問題:
有關刪除事件對象是什麼?當我這樣做時,我必須檢查相應的位置是否被多個事件使用。如果是這樣,我將取消關係,但保留Location對象。如果不是,我也必須刪除Location對象。我目前的做法(基於我的假設,即具有相同名稱的位置沒有得到雙重保存)看起來是這樣的:
Event *event = (event *)[appManager.results.fetchedObjects objectAtIndex:indexPath.row];
NSInteger locationEvents = 0;
for (Event *eve in appManager.results.fetchedObjects)
{
if (eve.Location.name == event.Location.name)
{
locationMoments++;
}
}
if (locationMoments == 1)
{
[appManager.managedObjectContext deleteObject:event.Location];
}
[appManager.managedObjectContext deleteObject:event];
所以,至少我覺得我檢查事件的數量是一定的位置對象是指。但代碼感覺有點癢......我不知道這是否正確。所以我最後的問題是: 我的方案中的標準程序是什麼?如果有的話。 ;)
謝謝大家提前你的答案!
你說一個關鍵路徑只適用於現有的對象。但是,當我創建一個事件並首次使用該事件的位置名稱時 - 必須創建一個新的位置對象,不是嗎?從那一刻起,具有相同Location.name的事件會自動分享它?只是問問。我真的很想知道發生了什麼。 :)你在空關係上刪除Location對象的方法聽起來是對的。我必須考慮這一點!我的代碼樣本是否符合要求?或者你通常如何在這種情況下檢查現有關係?非常感謝您的回答! – Leakazoid
創建'Event'對象不會自動創建'Location'對象,它只會在'Event'對象中創建一個空的'Event.location'屬性。您必須爲該關係分配新的或現有的「位置」對象。要檢查一個空關係,只需計算對象的數量,例如'[self.location count] == 0' – TechZen
好吧,我現在明白了。現在我也意識到問題是我保存實體的方式。每當創建一個新的Event對象時,我正在創建一個新的Location對象。 (思想核心數據可能會自動檢查重複項。)相反,我應該檢查一個現有的位置對象,它可能包含與當前輸入的名稱相同的名稱。然後我將它鏈接到我的新活動。我必須爲此目的創建一個位置對象的獲取請求,並帶有謂詞,對吧? ...再次感謝您的幫助,TechZen! – Leakazoid