【问题标题】:CoreData Relationships Lazy Load?CoreData 关系延迟加载?
【发布时间】:2010-09-13 01:08:31
【问题描述】:

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

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

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

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

book.bookmark;

CoreData 会为我分配一个新的“书签”实例吗?

在你让我试试这个并亲自看看之前:我有。我要么做错了,要么我打算实例化'Book'和'Bookmark'的两个实例并手动分配关系。在我的测试中,该关系具有“可选”未勾选,但未附加任何内容。在 'book' 实例上调用 getter 'bookmark' 时,我收到 'nil'。

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

【问题讨论】:

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


    【解决方案1】:

    如果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;
    }
    

    【讨论】:

    • 这对我不起作用。当我粘贴实现时,它只是粘贴“@dynamic myAttribute”。我正在使用 XCode 4.5,它没有“将 Objective-C 2.0 实现复制到剪贴板”菜单项,但它确实有一个“粘贴关系实现”,我认为这是正确的机制。有什么想法吗?
    • 我认为这应该是 [NSEntityDescription insertNewObjectForEntityForName: @"Bookmark" ...]
    【解决方案2】:

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

    这样的东西应该是你需要的:

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

    【讨论】:

    • +1 感谢您的回复。我希望 CoreData 会为我处理它,但手动创建它也一样好。 :)
    猜你喜欢
    • 1970-01-01
    • 2019-07-11
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多