Objective c Core Data 保存多对多关系
Posted
技术标签:
【中文标题】Objective c Core Data 保存多对多关系【英文标题】:Objective c Core Data Saving many to many relationships 【发布时间】:2012-03-15 11:17:25 【问题描述】:我有一个设置,其中两个对象通过多对多关系相关
艺术家>活动
即艺术家可以参加许多活动。一个活动可以有很多艺术家参加
所以我明白,如果关系是一对多的艺术家 > 事件,那么我可以创建事件对象并将艺术家对象分配给关系。
但是,由于两端是多对多的,我该如何保存这种关系?目前我尝试先保存事件对象,然后将艺术家对象放入 NSSet 并将该集合分配给艺术家 nsset 的事件指针。
但是当我回去查询 event.artists 时,我得到 0。
那么如何为核心数据保存多对多关系呢?
【问题讨论】:
【参考方案1】:每当我需要多对多关系时,我都会将其更改为两个一对多关系,如下所示:
-
创建一个新实体,例如艺术家活动
添加从 Artist 到 ArtistEvent 的一对多关系
Artist <--->> ArtistEvent
添加从 Event 到 ArtistEvent 的一对多关系ArtistEvent <<---> Event
您的整体图如下所示:
Artist <--->> ArtistEvent <<---> Event
现在,要在艺术家和事件之间创建新的关系,您只需创建一个新的 ArtistEvent 并将其艺术家属性设置为艺术家,并将其事件属性设置为事件。
如果您想查找(例如)艺术家将参加的所有活动的详细信息,这会增加一层额外的间接性,但对于改进关系的正常化来说,这样做是值得的。
【讨论】:
【参考方案2】:为您描述的对象图建立正确关系的最佳方法是创建一个“事件”实体,并添加一个关系(为了保持一致性和清晰起见),将其称为“艺术家”,它将具有“to- many" 连接(您将在 Xcode 的数据模型检查器中设置);
然后,创建一个名为“Artist”的实体,并类似地创建一个名为“events”的关系,其中包含“to-many”关系。
现在,在 Xcode 的模型编辑器中,选择“Event”实体并设置其“artists”关系的连接,在“Destination”下指向实体“Artist”。 对“艺术家”实体执行相同操作,并将其“事件”关系设置为指向“事件”。确保也设置了逆数(即“艺术家”的逆设置为“事件”,“事件”的逆设置为“艺术家”)。
现在,“events”是一个包含“Artist”实体的集合,“artists”是一个包含“Event”实体的集合。但是这些集合是不可变的。
要将“艺术家”实体添加到“艺术家”集中,您首先要创建一个像这样的可变代理集
NSManagedObject *someEvent = [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:context];
NSManagedObject *newArtist = [NSEntityDescription insertNewObjectForEntityForName:@"Artist" inManagedObjectContext:context];
NSMutableSet *artistMutableSet = [Event mutableSetValueForKey:@"artists"];
[artistsMutableSet addObject:newArtist];
要将“事件”实体添加到“事件”集中,请执行相反的操作。
【讨论】:
以上是关于Objective c Core Data 保存多对多关系的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Objective C 从 iOS 中的 Core Data 中过滤数据
Swift 2.1 Core Data - 保存具有一对多关系的数据,但如果已经存在则不要添加异构数据
Core Data MagicalRecord:获取请求并保存在多线程中。锁定获取的对象?