2010-09-13 122 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