2011-10-08 137 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];