如何使用to-many关系

时间:2013-08-13 22:14:21

标签: ios objective-c cocoa-touch cocoa core-data

让我说我有2个实体 - 运动员:带有“全名”属性 - Eval:带有“pullups”属性 - 我想为每个名字设置多个eval,但是如何告诉它哪个名字我想将具体的证据添加到?

我的应用程序与预装iOS的联系人应用程序非常相似。根视图控制器有我的第一个实体,运动员。这是一个显示所有运动员的桌面视图。当您选择一名运动员时,它会显示他/她的所有信息,并且有一个名为show eval的按钮。 Eval是我的第二个实体。运动员与Eval有很多关系,这意味着一名运动员可以有多次逃避,但是逃犯只能有一名运动员。我知道如何添加evals,但是当我添加它们时,它们就在那里,它们没有所有者,所以不管我选择哪个运动员,它只是显示所有的逃避。如何创建与所选运动员相关的评估值?

allevals.h

//the athlete selected pushes a tableviewcontroller with all evals, but I want it to only show evals for the athlete selected.
-(void)viewWillAppear:(BOOL)animated{
    self.title = [NSString stringWithFormat:@"%@'s Evaluations",_athletesFullName];

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    _managedObjectContext = [appDelegate managedObjectContext];

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *eval = [NSEntityDescription entityForName:@"Eval" inManagedObjectContext:_managedObjectContext];
    [request setEntity:eval];
    NSSortDescriptor *sortDescriptor =
    [[NSSortDescriptor alloc] initWithKey:@"date_recorded"
                                ascending:NO
                                 selector:@selector(localizedCaseInsensitiveCompare:)];
    NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor, nil];
    [request setSortDescriptors:sortDescriptors];

    NSError *error = nil;
    NSMutableArray *mutableFetchResults = [[_managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    if (mutableFetchResults == nil){
        //handle error
    }
    [self setEvalArray:mutableFetchResults];
    [self.tableView reloadData];
}

视图控制器如下,所有运动员tableview都是root tableviewcontroller,然后有一个add barbuttonitem,可以让你添加一个运动员。它重新加载视图,然后在tableview上你有你新添加的运动员,你点击他,然后它显示细节,加上一个按钮来查看他的遗嘱。从那里开始,这是另一个带有barbuttonitem的evals的表格视图。问题是,我不知道如何告诉刚刚添加的eval是谁的拥有者。

3 个答案:

答案 0 :(得分:1)

您的获取请求有一个sot订单和一个实体描述,但您错过了它可以使用的第三个项目。

如果您只想过滤适用于运动员的逃避,您需要在fetchrequest上设置谓词。

答案 1 :(得分:1)

添加新评估时: 创建新的eval实体并根据需要设置实体属性。 选择与评估符合的运动员并拨打addEval:,将两者联系在一起。

当试图让运动员使用athlete.evals的所有逃避时,它只会给你附属于运动员的评估实体。

答案 2 :(得分:0)

当用户选择查看运动员的逃避时,您需要将该运动员传递给evals视图控制器。视图控制器现在可以在过滤器谓词中使用它来获取要显示的evals,并在创建新eval时配置对象之间的链接。


newEval.whoTook = self.currentAthlete;