2009-05-09 5 views
7

Я возился с Core Data, и я уверен, что мне не хватает чего-то очевидного, потому что я не могу найти пример, который совсем напоминает то, что я пытаюсь сделать.Как выполнять запросы Core Data через отношения?

Предположим, что я играю с базой данных DVD. У меня два объекта. Фильм (название, год, рейтинг и отношение к Актеру) и Актер (имя, пол, фотография).

Получение всех фильмов легко. Это просто:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Winery" 
inManagedObjectContext:self.managedObjectContext]; 

Получение всех фильмов с «Kill» в заголовке легко, я просто добавить NSPredicate:

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
@"name LIKE[c] "*\"Kill\"*""]; 

Но ядро ​​данных кажется абстрактным из полей идентификаторов для управляемых объекты ... так как я запрашиваю атрибут, являющийся объектом (или: запрос к отношениям)?

Другими словами, если у меня уже есть объект Actor, то я заинтересован ([Object id 1 - 'Chuck Norris']), что такое формат Predicate для «Дайте мне все фильмы в главной роли [Идентификатор объекта 1 - 'Чак Норрис'] "?

ответ

6

Предполагая, что существует односторонняя обратная связь между субъектами Актера и Кино, вы можете просто получить сущность для Чака Норриса так же, как вы получите какую-либо конкретную сущность, а затем получить доступ к массиву фильма субъектов, привязанных к отношениям с субъектом Актора.

// Obviously you should do proper error checking here... but for this example 
// we'll assume that everything actually exists in the database and returns 
// exactly what we expect. 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Actor" inManagedObjectContext:self.managedObjectContext]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE[c] 'Chuck Norris'"]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entity]; 
[request setPredicate:predicate]; 

// You need to have imported the interface for your actor entity somewhere 
// before here... 
NSError *error = nil; 
YourActorObject *chuck = (YourActorObject*) [[self.managedObjectContext executeFetchRequest:request error:&error] objectAtIndex:0]; 

// Now just get the set as defined on your actor entity... 
NSSet *moviesWithChuck = chuck.movies; 

Как примечание, в этом примере, очевидно, предполагает, 10.5, используя свойства, но вы можете сделать то же самое в 10.4 с использованием методов доступа.

5

Или вы можете использовать другой предикат:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Actor" inManagedObjectContext:self.managedObjectContext]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",@"Chuck Norris"] 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entity]; 
[request setPredicate:predicate]; 

YourActorObject *chuck = [[self.managedObjectContext executeFetchRequest:request error:nil] objectAtIndex:0]; 
[request release]; 

NSSet *moviesWithChuck = chuck.movies; 
Смежные вопросы