如何使用Core Data关系?

时间:2013-12-06 03:34:37

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

在我的应用程序中,我有3个相关实体。运动员,运动和运动成绩。

运动员与运动有很多关系。它的反面是whosExercise。 运动与运动得分有很多关系。它的反面是哪个锻炼。

我想执行一个获取请求,我可以获得运动员的所有运动成绩。我怎么会这样?我需要运动员和运动成绩之间的另一种关系,还是多余的?如果是,我如何使用运动作为我的请求的谓词?

3 个答案:

答案 0 :(得分:0)

如果练习与运动员有关系,那么你应该能够做到这样的事情:

[NSPredicate predicateWithFormat:@"SELF.athlete = @%", currentAthlete];

然后只是:

[Exercise fetchByPredicate:currentAthletePredicate];

应该是它。

答案 1 :(得分:0)

如果我清楚地了解,您需要为运动员选择所有运动分数,但运动员与运动分数表没有直接关系。

SLQ查询可能如下所示:

 Select *
 from ExerciseScore
 where IDScore in (select IDScore
                     from  Exercise
                    where IDExercise in ( select IDExercise
                                           from Athlete
                                        )
                  )

但在Core Data中,您无法操作SLQ查询。 尝试这种方法。

1.为运动员取得所有运动:

NSError *error;
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Exercise"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.athlete = @%", currentAthlete];
request.predicate=predicate;
NSArray *athleteExercises = [self.managedObjectContext  executeFetchRequest:request error:&error];

2.在整个练习中进行迭代,以获得每个练习的所有练习分数。

NSMutableArray *allScores = [NSMutableArray arrayWithCapacity:0];;
for (Exercise *exercise in athleteExercises) {

  if ([exercise.scores count]>0) {
     [allScores addObjectsFromArray:[exercise.scores allObjects]; //exercise.scores must be NSSet type
  }
}

allScores数组现在包含特定ExerciseScore

的所有Athlete.个对象

答案 2 :(得分:0)

谓词可以有关键路径:

@"whichExercise.whosExercise = %@",athlete

或者,如果您已经拥有运动员,请不要执行获取请求,只需通过关系属性获取分数。