Навигация по диаграмме объектов основных данных

Вчера я задал вопрос, где я действительно должен был начать с более простого примера. Поставив мой вопрос на основы, мне удалось решить мою проблему, используя существующие ответы на вопросы и ответы.

Я подытоживаю свой вопрос здесь (и предоставляю свое собственное решение), потому что я не думаю, что есть какие-то должности, которые достаточно ясно объясняют это. Будучи новичком в Core Data и изо всех сил избегая идей SQL, я бы приветствовал отзывы о том, насколько уместно мое решение, и если есть лучшие способы моделирования проблемы.

Вопрос

Учитывая следующую объектную модель, которая имеет три объекта A, B и C, каждая из которых связана по-многим отношениям:

Модель

Как можно идентифицировать родительские сущности A , у которых есть сущности внуков C с определенным атрибутом? Например, используя эти экземпляры и их отношения:

пример

Как я могу найти, у какой сущности A есть дочерний объект C s с тегом: Да?

Решение

Я смог добиться этого, используя ключевое слово NSPredicate . Вот фрагмент кода, который работал для меня (при условии, что вы настроили контекст управляемого объекта и т. Д.):

 NSError *error = nil; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityA" inManagedObjectContext:context]; [fetchRequest setEntity:entity]; NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:@"(0 != SUBQUERY(child, $a, (0 != SUBQUERY($a.child, $child, $child.tag == %@)[email protected]))[email protected])", @"YES"]; [fetchRequest setPredicate:predicateTemplate]; NSArray *test = [context executeFetchRequest:fetchRequest error:&error]; 

Разрыв всей важной строки NSPredicate на несколько строк:

 (0 != SUBQUERY(child, $a, (0 != SUBQUERY($a.child, $child, $child.tag == %@)[email protected]) )[email protected] ) 

Важной частью является то, что мы EntityA для работы, а затем во вложенном подзапросе, работающем через child отношения объектов. Я ожидаю, что это можно повторить на несколько глубин. Не самая интуитивная вещь, которую нужно собрать … но она работает. Комментарии приветствуются.

Я никогда не пытался использовать подзапрос раньше, это очень круто и приятно видеть пример этого. Вы должны добавить решение в качестве ответа на вопрос на самом деле!

Возможно, я бы сделал это, как предположил Абизерн, поскольку это древовидная иерархия и ее легче пересечь дерево, используя одни отношения.

В коде это выглядит так:

 NSManagedObjectContext *moc = APPDELEGATE.managedObjectContext; NSFetchRequest *request = [NSFetchRequest new]; [request setEntity:[NSEntityDescription entityForName:@"EntityC" inManagedObjectContext:moc]]; [request setPredicate:[NSPredicate predicateWithFormat:@"tag = YES"]]; NSError *fetchError = nil; NSArray *children = [moc executeFetchRequest:request error:&fetchError]; 

children – массив объектов EntityC которые соответствуют предикату. Следующим шагом является получение набора уникальных объектов EntityA которые являются «бабушками и дедушками». Здесь мы можем использовать ключевое значение:

 NSArray *grandParents = [children valueForKeyPath:@"[email protected]"]; 

В этом случае для эффективности мы, вероятно, захотим предварительно parent.parent путь parent.parent parent.parent во время нашего первоначального запроса на выборку:

 [request setRelationshipKeyPathsForPrefetching:@[@"parent.parent"]]; 

Надеюсь это поможет!

Если вы следовали Руководству по основным данным и установили взаимные отношения, вы можете попробовать выполнить поиск снизу вверх.

Выбираем объекты Entity C, которые передают ваш требуемый предикат, а затем получают объект Entity A, поднимая родителей. Нет необходимости вложенных подзапросов.

Отредактировано для добавления

Вы можете получить родительский элемент C (который является объектом B) из parent отношения. И оттуда вы можете получить родительский объект (который является объектом A) из parent отношения.

Это в вашей диаграмме модели данных ядра.

  • Сбой приложения iOS при добавлении новой записи после поиска с помощью TableViewControllers с использованием основных данных и NSFetchedResultsControllers
  • NSPredicate с регулярным выражением всегда получает 0 результатов
  • Регулярное выражение для проверки целочисленного или десятичного числа в iOS
  • Как добавить два отдельных несвязанных предиката к одному fetchrequest в NSFetchedResultsController
  • В отличие от или нет, для сравнения строк в NSPredicate?
  • Использование предикатов для поиска вложенных массивов в iOS 5
  • Фильтр NSArray с использованием NSPredicate
  • ISP NSPredicate с вложенным массивом JSON
  • NSPredicate вопрос
  • ДОБАВЛЕНИЕ значений конкретного ключа из NSMutableDictonary (с использованием NSPredicate)
  • NSPredicate для того, где в запросе
  • Interesting Posts

    Переместите ручку UISlider в середину, дважды нажмите на нее

    libobjc.A.dylib at objc_msgSend: 15 crash

    Swift IOS 9 – Внедрение покупки в приложении возможно самым простым способом

    При отключении приложения PhoneGap после предупреждения о памяти

    Как я могу отобразить группу крови в UITextField, если пользователь нажимает на UIPickerview

    SWRevealViewcontroller не работает с iOS 7.1

    Как напечатать верхний индекс в xcode

    Ошибка проверки приложения iTunes Store при использовании подкачки Google / CloudMessaging

    iOS: Скрыть MapView Но сохранить изображение Overlay?

    Почему Sprite Kit SKNode подвергает zRotation, xScale и yScale вместо простого преобразования?

    ориентация камеры приложения iOS в captureOutput

    Интеграция профилировщика xcode с каскадной системой тестирования

    Как преобразовать данные kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange в YUV420P?

    Ручка 32 / 64bit правильно

    Как проверить поведение ограничений автоматического макета в xib без запуска приложения?

    Давайте будем гением компьютера.