2013-12-06 3 views
0

В моем приложении у меня есть 3 связанных объекта. Спортсмен, упражнение и оценка упражнений.Как использовать отношения Core Data?

У спортсмена есть много отношений с Упражнением. Это обратное - это whosExercise. Упражнение имеет очень много отношений с результатом. Это обратное - это упражнение.

Я хочу выполнить запрос на выборку, где я получаю все оценки упражнений для спортсмена. Как я получу это? Нужны ли мне другие отношения между спортсменами и упражнениями, или это избыточно? Если это так, как использовать упражнение в качестве предиката для моего запроса?

ответ

0

Если упражнение имеет отношение к спортсмену, то вы должны быть в состоянии сделать что-то вроде:

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

, а затем просто:

[Exercise fetchByPredicate:currentAthletePredicate]; 

Должно быть.

0

Если я четко понимаю, вам нужно выбрать все ExerciseScore для спортсмена, но у спортсмена нет прямой связи с таблицей ExerciseScore.

SLQ Запрос для этого может выглядеть так:

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

Но в Core Data вы не можете управлять SLQ запросов. Попробуйте этот подход.

1.Fetch все упражнения для спортсмена:

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.Iterate по всему спектру упражнений, чтобы получить все упражнение балл для каждого упражнения.

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.

0

Предикатов может иметь основные пути:

@"whichExercise.whosExercise = %@",athlete 

Или, если у вас есть спортсмен уже не делать выборку запроса , просто получите оценки через свойства отношений.

Смежные вопросы