如何使用 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 关系?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 上的 Core Data 中设置新创建的关系?
如何有效地迭代 NSSet (Objective-C) - Core Data 中的多对多关系表示?