Базовые данные: выборка через определенное свойство (связь соединения) - PullRequest
4 голосов
/ 16 сентября 2010

У меня есть базовая модель данных следующим образом

alt text

Свойство attributes Page представляет собой набор DictionaryEntry, они являются значениями для моих объектов Pageочень похоже на стандартный NSDictionary (за исключением того, что все keys и values являются строками)

У меня есть Page, который имеет DictionaryEntry с key="title" и value="Home".Как мне сформировать запрос на загрузку этой конкретной страницы?

Ответы [ 2 ]

7 голосов
/ 19 сентября 2010

Вы должны взглянуть на синтаксис предикатов для подзапросов. Вы не можете использовать обычное ЛЮБОЕ ключевое слово, так как это позволяет сопоставлять только один столбец, а не два одновременно.

  NSString *keyValue = @"title";
  NSString *valueValue = @"home";

  NSFetchRequest *request = [[NSFetchRequest alloc] init];
  [request setEntity:[NSEntityDescription entityForName:@"Page" inManagedObjectContext:_context]];
  [request setPredicate:[NSPredicate predicateWithFormat:@"(SUBQUERY(attributes, $a, $a.key == %@ && $a.value == %@).@count != 0)", keyValue, valueValue]];

Более простой предикат ANY attributes.key = "title" AND ANY attributes.value = "home" не будет работать, так как он также возвращает страницы с двумя диктовками, например, key = 'addr' / value = 'home' и key = 'title' / value = 'pete'.

1 голос
/ 18 сентября 2010

Предполагая, что вы начинаете, зная «ключ» к DictionaryEntry «Заголовок».

Почему бы не создать NSFetchRequest для объекта DictionaryEntry, используя ваш известный «ключ», когда вы создаете NSPredicate.

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"DictionaryEntry" inManagedObjectContext:_context]];
[request setPredicate:[NSPredicate predicateWithFormat:@"key == %@", keyValue]];

Как только у вас есть действительный объект DictionaryEntry, вы можете использовать ваши отношения CoreData "page", чтобы получить действительную страницу.

...