2010-09-13 118 views
2

當我有一個CoreData實體命名,比如,「書」,它與另一個實體(「書籤」),我需要同時插入的「書」的實例和「實例的一個一對一的關係書籤「到託管對象上下文中,並手動分配關係?核心數據關係惰性負載?

如果我執行以下代碼來實例化「書」的實例...

Book *book = [NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:managedObjectContext]; 

我可以,或者我不能,請執行以下代碼來檢索它的書籤沒有插入一個實例'Bookmark'到相同的託管對象上下文中?

book.bookmark; 

威爾CoreData分配「書籤」的新實例給我嗎?

之前你問我試試這個,看看自己:我有。我要麼做錯了什麼,或者我意味着實例「書籍」和「書籤」的兩個實例和手動分配的關係。在我的測試中,關係具有「可選」 取消選中但沒有連接到任何東西。在調用'book'實例的getter'書籤'後,我收到'nil'。

我希望能夠用我上面的代碼,因爲這將讓我的控制器對象來處理與被管理對象上下文,而我的模型對象可以完全忽略它。從我讀過的CoreData中,這似乎是預期的實現。如果我錯了,請糾正我。

回答

1

以我的經驗,你必須創建兩個實體和自己先創建關係。

這樣的事情應該是你所需要的:

Bookmark *bookmark = [NSEntityDescription insertNewObjectForEntityForName:@"Bookmark" inManagedObjectContext:managedObjectContext]; 
[book setBookmark: bookmark]; 
+0

+1謝謝你的迴應。我希望CoreData能夠爲我處理它,但手動創建它同樣好。 :) – Ryan 2010-09-13 10:23:34

3

如果Book對象總是需要Bookmark關係,那麼你可以寫爲bookmark屬性自定義的getter方法需要時,將插入一個bookmark對象。

Xcode會爲您生成最多的方法。在數據模型編輯器中按住Ctrl鍵並單擊bookmark並選擇Copy Objective-C 2.0 Implementation to the clipboard。然後調整這樣的事情:

- (NSManagedObject *)bookmark 
{ 
    id tmpObject; 

    [self willAccessValueForKey:@"bookmark"]; 
    tmpObject = [self primitiveBookmark]; 
    [self didAccessValueForKey:@"bookmark"]; 

    if (tmpObject==nil){ 
     BookmarkMO *newBookmark=[NSEntityDescription entityForName:@"Bookmark" inManagedObjectContext:self.managedObjectContext]; 
     newBookmark.book=self; //triggers kvo relationship assignment 
     tmpObject=newBookmark; 
    } 
    return tmpObject; 
} 
+0

這不適合我。當我粘貼實現時,它只是粘貼「@dynamic myAttribute」。我使用的是XCode 4.5,它沒有'Copy Objective-C 2.0實現到剪貼板'菜單項,但它確實有'粘貼關係實現',我認爲這是正確的機制。有任何想法嗎? – TomSwift 2012-11-05 19:23:59