Как выполнять запросы Core Data через отношения? - PullRequest
7 голосов
/ 10 мая 2009

Я возиться с основными данными, и я уверен, что упускаю что-то очевидное, потому что я не могу найти пример, который вообще напоминает то, что я пытаюсь сделать.

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

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

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

Получить все фильмы с надписью "Убить" легко, я просто добавляю NSPredicate:

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

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

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

Ответы [ 2 ]

6 голосов
/ 10 мая 2009

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

// 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 голосов
/ 13 января 2012

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

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...