如何使用 Core Data 关系?

Posted

技术标签:

【中文标题】如何使用 Core Data 关系?【英文标题】:How to use Core Data relationship? 【发布时间】:2013-12-06 03:34:37 【问题描述】:

在我的应用中,我有 3 个相关实体。运动员、运动和运动得分。

Athlete 与Exercise 有一对多的关系。它的反面是whosExercise。 运动与运动分数有一对多的关系。 whichExercise 是相反的。

我想执行一个获取请求,以获取运动员的所有锻炼分数。我怎么会得到那个?我是否需要运动员和锻炼分数之间的另一种关系,或者那是多余的?如果是,我将如何使用锻炼作为我的请求的谓词?

【问题讨论】:

【参考方案1】:

如果锻炼与运动员有关,那么您应该能够执行以下操作:

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

然后只是:

[Exercise fetchByPredicate:currentAthletePredicate];

应该是的。

【讨论】:

【参考方案2】:

如果我清楚地理解,您需要为 Athlete 选择所有的 ExerciseScore,但 Athlete 与 ExerciseScore 表没有直接关系。

对此的 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 数组现在包含特定 Athlete. 的所有 ExerciseScore 对象

【讨论】:

【参考方案3】:

谓词可以有关键路径:

@"whichExercise.whosExercise = %@",athlete

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

【讨论】:

以上是关于如何使用 Core Data 关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查关系是不是已建立 - Core Data

如何管理 Core Data 中的一对多关系?

如何在 iOS 上的 Core Data 中设置新创建的关系?

如何有效地迭代 NSSet (Objective-C) - Core Data 中的多对多关系表示?

我如何在 Core Data 中为球队、比赛和主客场球队关系建模?

如何获取 Core Data 中的关系项属性?