2013-06-20 213 views
0

我有一個名爲EntityA的實體包含與另一個實體(它不是可選的,具有1 - 1關係)的關係,稱爲EntityB,我希望當我創建EntityA時,EntityB的一個實例會自動創建。Coredata關係創建

可能嗎?

另外我正在使用CoreData模型版本控制。在我的下一個版本中,我將這個新實體(EntityB)引入到EntityA中,問題是我無法保存對象EntityA,因爲之前沒有創建entityB。

是否有可能在CoreData合併期間(這會在數據庫方案中添加EntityB),這種新的關係是否被創建?

非常感謝您的幫助。

蒂埃裏

回答

0

要回答你的第一個問題,你可以自動通過增加邏輯來創建一個和設置在EntityA的didAwakeFromInsert方法的關係創造EntityB。

我認爲你將不得不同樣處理你的第二個問題。你可以做的是添加邏輯到EntityA的didAwakeFromFetch方法來檢查與EntityB的關係的存在,並創建一個EntityB,如果它不存在。

0

正確的方法是通過在生成的NSManagedObject子類中設置關係。我強烈建議您查看名爲mogenerator(http://rentzsch.github.io/mogenerator/)的工具,因爲這樣可以讓您不斷更改核心數據模型,而不會丟失添加到核心數據實體子類的所有自定義代碼。 Mogenerator可以設置爲在您更改模型時自動生成新的子類,而不會破壞您編寫來處理核心數據實體的自定義代碼。如果您計劃以認真的方式使用核心數據,那麼學習它是值得的。

要手動生成這些文件(不包含mogenerator),只需在XCode中單擊您的核心數據模型文件,選擇要爲其創建子類的實體,單擊「編輯器」菜單並選擇「創建NSManagedObject子類...'

這將創建兩個文件,EntityA.h和EntityA.m(或EntityB,取決於您在單擊菜單項時選擇了哪個實體)。再次爲其他實體生成其文件(注意:確保在生成這些文件之前已經建立了關係設置,否則將不得不重新生成它們),再次執行相同的過程。

然後我通常創建類的方法是這樣的:

//In EntityA.h 
//between @interface and @end... 
+ (EntityA*)createNewEntityAInContext:(NSManagedObjectContext*)context; 


//In EntityA.m 
+ (EntityA*)createNewEntityAInContext:(NSManagedObjectContext*)context 
{ 
    EntityA* aEntityAObject = [NSEntityDescription insertNewObjectForEntityForName:@"EntityA" inManagedObjectContext:context] 

    EntityB* aEntityBObject = [EntityB createNewEntityBInContext:context]; 
    aEntityAObject.entityBLink = aEntityBObject; 

    return aEntityAObject; 
} 


//In EntityB.h 
//between @interface and @end... 
+ (EntityB*)createNewEntityBInContext:(NSManagedObjectContext*)context; 

//In EntityB.m 
+ (EntityB*)createNewEntityBInContext:(NSManagedObjectContext*)context 
{ 
    EntityB* aEntityBObject = [NSEntityDescription insertNewObjectForEntityForName:@"EntityB" inManagedObjectContext:context] 

    return aEntityBObject; 
} 

然後,您可以打電話給你+ createNewEntityAInContext:每當你想要一個新的對象和關係會自動創建方法。

關於您的其他問題,您要查找的內容稱爲定製核心數據遷移策略。你可以在谷歌搜索該主題的教程,並有很多鏈接。下面是我發現的第一眼看起來相當不錯:http://9elements.com/io/index.php/customizing-core-data-migrations/