2012-05-19 99 views
0

我正在使用Core Data和多對多關係:建築物可以有多個部門,部門可以位於多個建築物中。之前,數據庫工作過,我不確定如何實現這個核心數據,但我發現這個核心數據編程指南:核心數據多對多關係和數據完整性

如果在數據庫管理後臺,這使你 關注,不要擔心:如果您使用SQLite存儲,Core Data 會自動爲您創建中間連接表。

但是,並沒有真正的數據完整性。我試過插入幾個建築物體,現在只有一個屬性(數字),每次我設置它與之相關的部門對象(關係)。這會導致包含具有相同建築物編號的多個建築物對象的數據庫全部與不同的部門對象有關。理想情況下,每個建築物編號會有一個對象,其中包含位於其中的所有不同部門。

所以,我的問題是:核心數據可以以某種方式維護數據完整性,還是應該在插入之前檢查具有該編號的建築物對象是否已經存在?看起來我必須手動檢查它,但如果Core Data可以爲我做這件事,那將會很酷。

回答

1

什麼melsam寫道是對的。除了他的回答,我建議你使用反向關係。關於反演,Apple說:

您通常應該在兩個方向建模關係,並且 指定適當的反關係。核心數據使用此 信息來確保對象圖的一致性(如果發生更改 )(請參閱「處理關係和對象圖完整性」)。 對於如果你不這樣做,看到 可能出現的一些原因你可能想不 模式在兩個方向上的關係的原因,和一些問題的討論「單向關係。」

需要了解的一個關鍵點是,當您使用Core Data時,您可以使用對象。因此,完整性標準可以在保存上下文時解決,也可以在上下文中對上下文進行處理以處理待處理的更改(請參閱processPendingChanges方法)。

關於你的問題,我想你必須創建一個提取請求並檢索你正在尋找的對象(例如,你可以提供給每個對象一個特定的ID並用你想要的ID設置一個謂詞) 。 如果獲取請求檢索某些對象,則可以更新它們。如果不是,請用insertNewObjectForEntityForName:inManagedObjectContext:創建一個新對象。最後保存上下文。

我建議您閱讀關於Efficiently Importing Data

希望它有幫助。

+0

我確實讀過蘋果文檔,我想我沒有意識到我真正想要什麼,直到我寫下來併發布。感謝您成爲我的橡皮鴨傢伙! –

1

核心數據爲您維護數據完整性。我可以向您保證(從Core Data的豐富經驗)您不必手動檢查完整性。請仔細檢查您的關係和刪除規則是如何在Xcode的核心數據模型編輯器中設置的。我無法確切知道您提供的詳細信息可能存在什麼問題,但是如果您四處尋找,您會發現它。

+0

核心數據模型對我來說很好。我有一個SQL背景,所以我知道一切。它確實有道理,它每次都插入新的對象,因爲我通過調用'insertNewObjectForEntityForName:inManagedObjectContext:'告訴它。我想我想讓Core Data做的事情是更新,如果記錄已經存在,並插入,如果它沒有,但這可能太多問。 –