目标c核心数据保存多对多关系

时间:2012-03-15 11:17:25

标签: objective-c core-data many-to-many

我有一个设置,其中两个对象通过多对多关系

艺术家<< ---->>事件

即艺术家可以参加许多活动。一个活动可以有很多艺术家参加

所以我理解,如果关系是一对多的说艺术家< --->>然后我可以创建事件对象并将艺术家对象分配给关系。

然而,由于两端都是多对多,如何保存这种关系?目前我已经尝试首先保存事件对象,然后我将艺术家对象放入NSSet并将该集合分配给艺术家nsset的事件指针。

但是当我回去查询event.artists时,我得到0。

那么如何为核心数据保存多对多关系呢?

2 个答案:

答案 0 :(得分:2)

每当我需要多对多关系时,我会将其更改为两个一对多的关系:

  1. 创建一个新实体,例如ArtistEvent
  2. 添加从Artist到ArtistEvent Artist <--->> ArtistEvent
  3. 的一对多关系
  4. 添加从Event到ArtistEvent ArtistEvent <<---> Event
  5. 的一对多关系

    您的整体图表如下所示:

    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];

要将“事件”实体添加到“事件”集,您可以执行相反的操作。