当我有一个名为的CoreData实体,比如'Book',它与另一个实体('Bookmark')有一对一的关系时,我需要插入一个'Book'实例和一个实例将“书签”加入托管对象上下文,并手动分配关系?
如果我执行以下代码来实例化“Book”的实例......
Book *book = [NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:managedObjectContext];
我是否可以执行以下代码来检索其书签,而无需将“书签”实例插入到同一个托管对象上下文中?
book.bookmark;
CoreData会为我分配一个新的'Bookmark'实例吗?
在你让我尝试这个并亲眼看看之前:我有。我做错了,或者我意味着实例化“Book”和“Bookmark”的两个实例并手动分配关系。在我的测试中,关系具有“可选”未标记但不附加到任何内容。在'book'实例上调用getter'bookmark'后,我收到'nil'。
我希望能够使用上面的代码,因为它将允许我的控制器对象处理托管对象上下文,而我的模型对象可以完全忽略它。从我读过的CoreData来看,这似乎是预期的实现。如果我错了,请纠正我。
答案 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];