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 中

Core Data MagicalRecord:获取请求并保存在多线程中。锁定获取的对象?

IOS/objective-c/core-data:如何从相关实体获取属性

多上下文麻烦。无法在 Core Data 中创建两个队列(主队列和私有队列)保存数据