Как создать NSFetchRequest, который фильтрует объекты Core Data на основе атрибутов И отношений? - PullRequest
28 голосов
/ 07 октября 2009

У меня настроена модель ядра данных примерно так:

  • Блокбастер Сущность
    • Отношение ко-многим DVD сущностей.
  • DVD Сущность
    • заголовок атрибут (строка)
    • Отношение «Один к одному» с родителем Блокбастер Сущность

Один блокбастер может иметь несколько DVD-дисков (To-Many). Каждый DVD может быть только частью одного блокбастера (To-One).

Существует несколько блокбастеров, и некоторые из них могут содержать объекты DVD, которые имеют тот же заголовок, что и объекты DVD других блокбастеров. Например, Блокбастер A может иметь копию «Трансформеры 2», как и Блокбастер C и Блокбастер G . Давайте представим, что в «Блокбастере» не было более одной копии одноименного фильма.

Мне интересно получить DVD Transformers 2 с Blockbuster C . Я не хочу копий с Blockbuster A или G , потому что мой босс часто там, и я могу только сгореть с этим куском мусора в Blockbuster C .


У меня вопрос, как мне сформировать NSFetchRequest, который захватывает DVD с заголовком "Transformers 2", который является потомком Blockbuster"C" родительский объект?

Этот тип запроса будет захватывать все DVD-диски "Transformer 2", но не тот, который относится к объекту Blockbuster C:

NSManagedObjectContext *moc = [self managedObjectContext];

NSString *aTitle = @"Transformers 2";
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@", aTitle];
[request setEntity:[NSEntityDescription entityForName:@"DVD" inManagedObjectContext:moc]];
[request setPredicate:predicate];

NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];

// error handling code
[request release];

Есть ли способ передать, скажем, идентификатор объекта связанного объекта в предикат NSP, фильтруя на основе этого?

1 Ответ

46 голосов
/ 07 октября 2009

Вы можете просматривать отношения в NSPredicate. Например, вы можете написать что-то вроде

[NSPredicate predicateWithFormat:@"title == %@ AND blockbuster.name LIKE \"Blockbuster C\"", @"Transformers 2"]

Теперь, если у вас нет свойства для сравнения и вам нужно проверить реальные объекты, вы можете использовать что-то вроде

[NSPredicate predicateWithFormat:@"title == %@ AND blockbuster IN %@", @"Transformers 2", setOfBlockbusters]

Полный синтаксис задокументирован здесь . Но setOfBlockbusters может быть набором, массивом или словарем (если это словарь, используются значения, а не ключи).

...