2011-10-08 12 views
7

コアデータを初めて使用しているため、いくつか質問があります。私は2つ質問しますコアデータを挿入して複数のリレーションエンティティをフェッチする

1)TeamとTeamMembersの2つのエンティティがあります。それらは多対多の関係、すなわち1つのチームが多くのメンバーを有することができる。最初に、モデルとそのモデルの.hファイルを次のように見て、私がチームとチームメンバーの間に正しい関係を作っているかどうかを教えてください。

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

はい、あなたが逆の関係を作ってきたセット戻っています。あなたには、多くのチームを持つチームメンバーと1人のメンバーに所属するチームがいます。関係線の矢印でわかることができます。二重矢印は「たくさんあります」を意味し、単一の矢印は「ある」または「所属」を意味します(矢印が指し示す方向に読み取られます)。

モデルナビゲータの方向を切り替えて、既存の生成クラスを破棄してから再生成する必要があります。

リレーションシップを正しく設定したら、生成されたアクセサを使用してチームにメンバーを追加し、特定のチームのメンバーを取得できます。チームに新しいチームメンバーを追加することの一例を示す

EDIT:

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

それはそれと同じくらい簡単です。 Core Dataは、リバースリレーションシップが自動的に更新されるようにします。チームのteamMembersコレクションには、追加したばかりの新しいメンバーが含まれます。

+0

感謝。特定のチームのTeamMembersに挿入の例を示してください。 –

+0

複数のものではなく単数のオブジェクトとしてあなたのエンティティに名前を付けることもできます。 「Team」と「TeamMember」ではなく「Team」と「TeamMember」です。 –

+0

サンプルコードを表示していただきありがとうございます。チームメンバーのNSSetをチームに追加する方法も示してください。 –

1

たぶん、私の答えは手遅れになりますが、「関係」プロパティ・ウィンドウで、「対多の関係」チェックを忘れないでください。重要度の高いルールと「多対多の関係」を削除します。

多分これはまた、私は次のコードでNSMutableArrayのから関連するオブジェクトを挿入しています、参考になります:返信用

NSSet *itemsSet; 
[itemsSet setByAddingObjectsFromArray:YOUR_NSMUTABLEARRAY]; 
[MAIN_OBJECT addItems:itemsSet]; 
関連する問題