2012-03-15 91 views
2

我有一个设立在那里的两个对象是由许多相关的许多关系目标C核心数据保存多对多关系

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

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

所以我明白,如果关系是一对多艺术家说< --- >>事件,那么我可以创建事件对象,并指定艺术家对象的关系。

但是,既然两端都是多对多的,我该如何拯救这种关系呢?目前,我试图先保存事件对象,然后将艺术家对象放入NSSet中,并将该集合分配给艺术家nsset的事件指针。

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

所以,你怎么许多保存到核心数据一对多的关系?

回答

2

每当我有许多关系需要的很多,我将其更改为两个一到多的关系是这样的:

  1. 创建一个新的实体,例如ArtistEvent
  2. 添加一个由艺术家许多关系到ArtistEvent Artist <--->> ArtistEvent
  3. 添加一个从事件许多关系到ArtistEvent ArtistEvent <<---> Event

你的总体框图如下:

Artist <--->> ArtistEvent <<---> Event 

现在,为了创建艺术家和事件之间的新关系,您只需创建一个新的ArtistEvent并将其艺术家属性设置为艺术家及其事件属性。

如果您想查找(说)艺术家将参加的所有活动的详细信息,这会增加额外的间接水平,但这对改善关系正常化是值得的。

0

为描述创建“事件”实体并添加关系(为了一致性和清晰起见)建立对象图的适当关系的最佳方式称为“艺术家”,其将具有“到-many“连接(你将在Xcode的数据模型检查器中设置);

然后,创建一个名为“艺术家”的实体,并以“一对多”关系类似地创建一个名为“events”的关系。

现在,在Xcode的模型编辑器中,选择“Event”实体并设置其“艺术家”关系的连接,在“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]; 

要在“事件”实体添加到“事件”集,你做相反。