我有一个设置,其中两个对象通过多对多关系
艺术家<< ---->>事件
即艺术家可以参加许多活动。一个活动可以有很多艺术家参加
所以我理解,如果关系是一对多的说艺术家< --->>然后我可以创建事件对象并将艺术家对象分配给关系。
然而,由于两端都是多对多,如何保存这种关系?目前我已经尝试首先保存事件对象,然后我将艺术家对象放入NSSet并将该集合分配给艺术家nsset的事件指针。
但是当我回去查询event.artists时,我得到0。
那么如何为核心数据保存多对多关系呢?
答案 0 :(得分:2)
每当我需要多对多关系时,我会将其更改为两个一对多的关系:
Artist <--->> ArtistEvent
ArtistEvent <<---> Event
您的整体图表如下所示:
Artist <--->> ArtistEvent <<---> Event
现在,要创建艺术家和事件之间的新关系,您只需创建一个新的ArtistEvent,并将其艺术家属性设置为艺术家及其事件属性。
如果您想查找(比方说)艺术家将参加的所有活动的详细信息,这会增加额外的间接水平,但是对于改善关系规范化是值得的。
答案 1 :(得分:0)
建立对象图的正确关系的最佳方式,您描述的是创建“事件”实体,并添加关系(为了一致性和清晰度)称之为“艺术家”,其将具有“ - 许多“连接(您将在Xcode中的数据模型检查器中设置);
然后,创建一个名为“Artist”的实体,同样创建一个名为“events”的关系,其关系为“to-many”。
现在,在Xcode的模型编辑器中,选择“事件”实体并设置其“艺术家”关系的连接,在“目标”下指向实体“艺术家”。 对“艺术家”实体执行相同操作并将其“事件”关系设置为指向“事件”。确保设置反转也是如此(即“艺术家”的反向设置为“事件”,反向设置为“艺术家”的“事件”)。
现在,“events”是包含“Artist”实体的集合,“artists”是包含“Event”实体的集合。然而,这些集合并不可变。
要将“Artist”实体添加到“artists”集,首先要创建一个像这样的可变代理集
NSManagedObject *someEvent = [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:context];
NSManagedObject *newArtist = [NSEntityDescription insertNewObjectForEntityForName:@"Artist" inManagedObjectContext:context];
NSMutableSet *artistMutableSet = [Event mutableSetValueForKey:@"artists"];
[artistsMutableSet addObject:newArtist];
要将“事件”实体添加到“事件”集,您可以执行相反的操作。