是否有人有教程或源代码显示正在使用的多对多关系,用户可以动态添加元素?我想看一看,因为阅读它并没有多大帮助。
答案 0 :(得分:23)
人们常常被多对多关系混淆,因为一个实体将关系表示为一个集合而另一个实体将其表示为单个对象。采取以下实体:
EntityA{
name:string
bees<-->>EntityB.a
}
EntityB{
name:string
a<<-->EntityA.bees
}
在EntityA中,关系bees
是一个集合,因为关系中可能有许多EntityB对象。因此,使用键值编码,您必须使用mutableSetForKey:
扩展所有内容才能访问该关系,以查看详细信息:
NSMutableSet *muteSet=[anEntityAObj mutableSetValueForKey:@"bees"];
[muteSet addObject:aNewBObj];
[anEntityAObj setValueForKey:@"bees"];
......或更紧凑:
[[anEntityAObj mutableSetValueForKey:@"bees"] addObject:aNewBObj];
但是,如果从EntityB端进行设置,则只添加一个对象,因此您可以直接使用setValueForKey:这样:
[anEntityBObj setValueForKey:anEntityAObj];
如果您使用通用NSManagedObject实例来表示您的实体,那就是这样。如果您创建自定义子类,那么您可以使用属性和方法为您进行设置:
[anEntityAObj addBeesObject:anEntityBObj];
anEntityBObj.a=anEntityAObj;
还要记住,对于托管对象,将设置为倒数的关系的一侧设置为自动设置另一侧,并以同样的方式删除。
假设我有2个实体 - 人:具有“名称”属性 - 时代:具有“时间”属性 - 我愿意 想要为每个设置多次 名字,但我怎么告诉它的名字 我想补充具体的时间 到?
您不会创建与属性的关系,在本例中为name
,而是与对象建立关系,在本例中为Person
实体/类的实例。每个Person
个对象与所有其他Person
对象完全分开,即使它们在name
属性中具有相同的值。
您必须获取对任何特定Parent
对象的引用。如果您刚刚插入了一个新的Parent
对象,那么您已经有了它的引用。如果已经插入/持久化,则使用谓词创建一个提取,该谓词将返回正确的对象。获得正确的Parent
对象后,只需将Time
个对象添加到关系中即可。
所以,如果你的实体看起来像这个伪代码:
Parent{
name:string
times<-->>Time.parent
}
Time{
theTime:date
parent<<-->Parent.times
}
...并且您正在使用通用NSManagedObjects来实例化实体,您可以设置现有Parent
对象与新Time
对象之间的关系,如下所示:
NSManagedObject *existingParent= //... results of a fetch
NSManagedObject *newTime=[NSEntityDescription insertNewObjectForEntityForName:@"Time" inManagedObjectContext:self.moc];
[newTime setValue:[NSDate date] forKey:@"theTime"];
[newTime setValue:existingParent forKey:@"parent"];
请注意,如果从Time
对象侧设置关系,则可以使用setValue:ForKey:因为从Time
对象的角度来看,关系只是一个对象的一个对象。
一旦开始考虑对象而不是数据库,这真的很简单。您在上下文中插入的每个对象都是唯一的,即使它与同一实体/类的其他对象共享属性也是如此。这就是为什么你可以设置特定对象之间的关系而不必担心存储在其属性中的值。
答案 1 :(得分:10)
以下是一对多关系的示例,只要您设置了关系,以便它们具有反向,就可以轻松管理。最后,Entity1的chilren属性将包含entity2和entity3
Entity1 *entity1=[NSEntityDescription insertNewObjectForEntityForName:@"Entity1" inManagedObjectContext:self.managedObjectContext];
Entity2 *entity2=[NSEntityDescription insertNewObjectForEntityForName:@"Entity2" inManagedObjectContext:self.managedObjectContext];
Entity2 *entity3=[NSEntityDescription insertNewObjectForEntityForName:@"Entity2" inManagedObjectContext:self.managedObjectContext];
[entity2 setParentEntity:entity1];
[entity3 setParentEntity:entity1];
NSError *error;
[[self managedObjectContext]save:&error];
NSSet *set=[entity1 children];
答案 2 :(得分:3)
获取Marcus Zarra的书“核心数据”(你可以购买PDF而不是纸张以获得即时满足......)它也提供了Mac OS X中的示例,但它比起步更进一步。您将找到有用的东西,如版本控制,转换规则,优化。这本书保存了我的一个项目,因为他迟到了。慢!
答案 3 :(得分:3)
我目前正在使用这本电子书并写得非常好: 它解释并说明了如何创建数据模型,还有代码示例..
“适用于iOS的专业核心数据” http://apress.com/book/view/1430233559
希望有所帮助
答案 4 :(得分:3)
下载iPhoneCoreDataRecipes示例代码。这是Core Data的完整工作演示,也是熟悉这些概念的绝佳方式。
答案 5 :(得分:2)
答案 6 :(得分:0)
请参阅Apple的Core Data Programming Guide。
我使用mutableSetValueForKey创建对象并将它们添加到关系中:
mutableSetValueForKey:返回一个可变的代理对象。如果改变其内容,它将为关系发出适当的键值观察(KVO)更改通知。
答案 7 :(得分:0)