Основные данные «многие ко многим» - предикатный вопрос - PullRequest
20 голосов
/ 24 февраля 2010

В моей модели базовых данных у меня есть две сущности: список и пациент. Список имеет атрибут с именем «name».

Список может иметь любое количество пациентов, и каждый пациент может принадлежать к любому количеству различных списков. Поэтому я установил в Списке отношение, называемое «пациентами», которое имеет обратную зависимость ко многим для пациента, И отношение к пациенту, называемое «списки», которое имеет отношение ко многим для Списка.

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

Как бы я поступил об этом? Я никогда раньше не использовал отношения в Базовых данных.

Спасибо

Ответы [ 3 ]

19 голосов
/ 24 февраля 2010

Учитывая модель данных, такую ​​как:

Список << —— >> Пациент,

, вы можете найти все экземпляры Пациента, которые принадлежат списку с определенным именем с запросом на выборку наобъект Patient, использующий предикат, такой как:

[NSPredicate predicateWithFormat:@"ANY lists.name LIKE[cd] %@", listName]

, предполагая, что listName - это NSString экземпляр с нужным именем списка.LIKE[cd] выполняет сравнение без учета регистра и диакритического знака.

15 голосов
/ 30 марта 2010

Кажется, это работает нормально:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY lists == %@)", myList];

Где myList - фактическая сущность List.

10 голосов
/ 24 февраля 2010

Похоже, ваша модель данных такова:

Список << - >> Пациент

Я думаю, что если вы знаете конкретное имя списка, то вы знаете конкретный объект списка. Если это так, вы можете просто захватить пациентов, используя отношение «многие» от Списка к пациенту - это набор объектов пациента. Например, если отношение «Список» к «Пациенту» называется «пациентами»:

NSSet *patientSet = listObject.patients;

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

Если вы знаете имя списка только по какой-то причине и выбираете объекты Patient, то вы можете создать предикат, используя отношение «многие» от пациента к списку (предположим, что оно называется «списки» и имя списка в строка с именем "listName"):

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY lists.name == %@",listName];
...