CoreData关系延迟加载?

时间:2010-09-13 01:08:32

标签: iphone objective-c core-data ios relationship

当我有一个名为的CoreData实体,比如'Book',它与另一个实体('Bookmark')有一对一的关系时,我需要插入一个'Book'实例和一个实例将“书签”加入托管对象上下文,并手动分配关系?

如果我执行以下代码来实例化“Book”的实例......

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

我是否可以执行以下代码来检索其书签,而无需将“书签”实例插入到同一个托管对象上下文中?

book.bookmark;

CoreData会为我分配一个新的'Bookmark'实例吗?

在你让我尝试这个并亲眼看看之前:我有。我做错了,或者我意味着实例化“Book”和“Bookmark”的两个实例并手动分配关系。在我的测试中,关系具有“可选”未标记但不附加到任何内容。在'book'实例上调用getter'bookmark'后,我收到'nil'。

我希望能够使用上面的代码,因为它将允许我的控制器对象处理托管对象上下文,而我的模型对象可以完全忽略它。从我读过的CoreData来看,这似乎是预期的实现。如果我错了,请纠正我。

2 个答案:

答案 0 :(得分:4)

如果Book对象始终需要Bookmark关系,那么您可以为bookmark属性编写自定义getter方法,以便在需要时插入bookmark对象。

Xcode将为您生成最多的方法。在数据模型编辑器中按住Control键并单击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;
}

答案 1 :(得分:2)

根据我的经验,你必须先创建两个实体并自己创建关系。

这样的事情应该是你需要的:

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