我在哪里可以找到Core Data to-many关系的一个很好的例子?

Jam*_*nay 9 iphone xcode core-data objective-c

有没有人有一个教程或源代码,显示正在使用的多对多关系,用户在哪里添加元素?我想看一看,因为阅读它并没有多大帮助.

Tec*_*Zen 23

人们经常被许多关系所困惑,因为一个实体将关系表示为一个集合而另一个实体将其表示为单个对象.采取以下实体:

EntityA{
    name:string
    bees<-->>EntityB.a
}

EntityB{
    name:string
    a<<-->EntityA.bees
}
Run Code Online (Sandbox Code Playgroud)

在EntityA中,关系bees是一个集合,因为关系中可能有许多EntityB对象.因此,使用键值编码,您必须使用mutableSetForKey:扩展所有内容来访问关系,以查看详细信息:

NSMutableSet *muteSet=[anEntityAObj mutableSetValueForKey:@"bees"];
[muteSet addObject:aNewBObj];
[anEntityAObj setValueForKey:@"bees"];
Run Code Online (Sandbox Code Playgroud)

......或更紧凑:

[[anEntityAObj mutableSetValueForKey:@"bees"] addObject:aNewBObj];
Run Code Online (Sandbox Code Playgroud)

但是,如果从EntityB端设置,则只添加一个对象,因此您可以直接使用setValueForKey:如下所示:

[anEntityBObj setValueForKey:anEntityAObj];
Run Code Online (Sandbox Code Playgroud)

如果您使用通用NSManagedObject实例来表示您的实体,那就是这样.如果您创建自定义子类,那么您可以使用属性和方法为您进行设置:

[anEntityAObj addBeesObject:anEntityBObj];
anEntityBObj.a=anEntityAObj;
Run Code Online (Sandbox Code Playgroud)

还要记住,对于托管对象,设置定义为倒数的关系的一侧自动设置另一侧,并且删除工作方式相同.

更新

让我说我有2个实体 - 人:具有"名称"属性 - 时间:具有"时间"属性 - 我想为每个名称设置多次,但是如何告诉它我想要哪个名字添加特定时间?

在这种情况下,您不会创建与属性的关系,name而是使用对象创建关系,在本例中是Person实体/类的实例.每个单独的Person对象与所有其他Person对象完全分离,即使它们的name属性具有相同的值.

您必须获取对任何特定Parent对象的引用.如果您刚刚插入了一个新Parent对象,那么您已经有了它的引用.如果已经插入/持久化,则使用谓词创建一个提取,该谓词将返回正确的对象.一旦拥有了正确的Parent对象,就可以将Time对象添加到关系中.

所以,如果你的实体看起来像这个伪代码:

Parent{
    name:string
    times<-->>Time.parent
}

Time{
    theTime:date
    parent<<-->Parent.times
}
Run Code Online (Sandbox Code Playgroud)

...并且您正在使用通用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"];
Run Code Online (Sandbox Code Playgroud)

请注意,如果从Time对象侧设置关系,则可以使用setValue:ForKey:因为从Time对象的角度来看,关系只是一个对象的一个​​对象.

一旦开始考虑对象而不是数据库,这真的很简单.您在上下文中插入的每个对象都是唯一的,即使它与同一实体/类的其他对象共享属性也是如此.这就是为什么你可以设置特定对象之间的关系而不必担心存储在其属性中的值.


小智 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];
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述