首页 文章

核心数据插入和获取多对多关系实体

提问于
浏览
7

我是核心数据的新手,因此我几乎没有问题 . 我会问两个

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

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)我需要示例代码插入Team然后插入其团队成员 . 另外如何获取特定团队的团队成员 .


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

3 回答

  • 1

    我希望链接有效 . http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdCreateMOs.html#//apple_ref/doc/uid/TP40001654-CJBDBHCB

    苹果文档在这里非常清楚 .

    NSManagedObject *newTeam = [NSEntityDescription insertNewObjectForEntityForName:@"Team" inManagedObjectContext:context];

  • 1

    也许我的答案为时已晚,但不要忘记在“关系”属性窗口中选中“To-Many Relationship” . 删除重要规则以及“多对多关系” .

    也许这也会有所帮助,我通过以下代码从NSMutableArray插入相关对象:

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

    是的,你已经 Build 了相反的关系 . 您有一个团队成员,有许多团队和一个属于一个成员的团队 . 您可以通过关系线上的箭头来判断:双箭头表示“有很多”,单箭头表示“有一个”或“属于”(按箭头指向的方向读取) .

    您应该在模型导航器中切换方向,废弃现有生成的类,然后重新生成它们 .

    如果正确设置了关系,则可以使用生成的访问者将成员添加到团队并检索特定团队的成员 .

    编辑以显示向团队添加新团队成员的示例:

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

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

相关问题