2011-10-08 140 views
7

我是核心数据的新手,因此我有几个问题。我会问两个核心数据插入和获取多对多关系实体

1)我有两个实体名为Team和TeamMembers。他们有多对多的关系,即一个团队可以有很多成员。首先请看下面的模型图和.h文件,并让我知道我是否已经在Team和TeamMembers之间建立了正确的一对多关系(我有一种感觉,我已经建立了相反的关系)。

enter image description here

Teams.h

#import <CoreData/CoreData.h> 

@class TeamMembers; 

@interface Teams : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSString * team_name; 
@property (nonatomic, retain) NSString * color; 
@property (nonatomic, retain) NSString * points; 
@property (nonatomic, retain) TeamMembers * members; 

@end 

TeamMembers.h

#import <CoreData/CoreData.h> 

@class Teams; 

@interface TeamMembers : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSString * member_name; 
@property (nonatomic, retain) NSSet* teams; 

@end 


@interface TeamMembers (CoreDataGeneratedAccessors) 
- (void)addTeamsObject:(Teams *)value; 
- (void)removeTeamsObject:(Teams *)value; 
- (void)addTeams:(NSSet *)value; 
- (void)removeTeams:(NSSet *)value; 

@end 

2)请我需要的示例代码插入小组随后将其团队成员。另外如何获取特定团队的团队成员。


EDITED 我使用下面的代码插入到团队和团队成员的实体,但它没有返回在NSSet中所有团队成员。它只返回结果集中的一个团队成员

self.context = [del managedObjectContext]; 

      Teams *teamobj = [NSEntityDescription 
          insertNewObjectForEntityForName:@"Teams" 
          inManagedObjectContext:context]; 
      teamobj.team_name = teamname.text; 
      teamobj.color = [NSString stringWithFormat:@"%d", color]; 
      teamobj.points = [NSString stringWithFormat:@"%d", 0]; 

      for(UITextField *view in self.scrollview.subviews) 
      { 
       if([view isKindOfClass:[UITextField class]]) 
       { 
        if ([view tag] == 99) { 
         if (![view.text isEqualToString:@""]) { 
          noone = YES; 
          TeamMembers *teammember = [NSEntityDescription 
               insertNewObjectForEntityForName:@"TeamMembers" 
               inManagedObjectContext:context]; 
          teammember.member_name = view.text; 
          teammember.teams = teamobj; 

          [teamobj addMembersObject:teammember]; 
         } 
        } 
       } 
      } 
if (![context save:&error]) { 
       NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Failure" message:@"Unable to save team at the moment." delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil]; 
       [alert show]; 
       [alert release];    
      } 

回答

8

是的,你有相反的关系。你有一个团队成员拥有多个团队和一个属于一个成员的团队。你可以通过关系线上的箭头来判断:双箭头表示'有很多',单箭头表示'有一个'或'属于'(按照箭头指向的方向阅读)。

你应该在模型导航器中切换方向,垃圾现有的生成的类然后重新生成它们。

当您建立正确的关系时,您可以使用生成的访问器将成员添加到团队并检索特定团队的成员。

EDIT显示例如添加一个新的团队成员的团队:

TeamMember *newTeamMember = [NSEntityDescription insertNewObjectForEntityForName:@"TeamMember" inManagedObjectContext:context]; 
newTeamMember.team = <existing team managed object> 

就这么简单。核心数据将确保自动更新反向关系,因此团队的teamMembers集合将包括刚刚添加的新成员。

+0

感谢您的答复。你能否给出一个在TeamMembers中为特定团队插入的示例 –

+0

也可以将你的实体命名为单数对象而不是复数;所以'团队'和'团队成员',而不是'团队'和'团队成员'。 –

+0

感谢您展示示例代码。你是否也可以展示如何将NSSet团队成员添加到团队中? –

1

也许我的回答将是为时已晚,但不要忘记检查“一对多关系”中的“关系”属性窗口。删除重要规则以及“多对多关系”。

也许这也将是有帮助的,我用下面的代码插入来自NSMutableArray的相关对象:

NSSet *itemsSet; 
[itemsSet setByAddingObjectsFromArray:YOUR_NSMUTABLEARRAY]; 
[MAIN_OBJECT addItems:itemsSet];