Связь "многие ко многим" основных данных - вопрос с предикатом

В моей модели Core Data у меня есть две сущности: List и Patient. Список имеет атрибут под названием «имя».

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

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

Как мне это сделать? Я никогда раньше не использовал отношения в Core Data.


person Garry Pettet    schedule 24.02.2010    source источник


Ответы (4)


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

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

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

person Garry Pettet    schedule 30.03.2010

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

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

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

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

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

person Barry Wark    schedule 24.02.2010
comment
У меня есть объект List в памяти, и я передаю его подклассу UITableViewController. Как мне создать запрос на выборку, чтобы получить всех пациентов из этого списка? Я пытаюсь использовать NSFetchedResultsController, а имя списка не является уникальным (поэтому построение предиката на основе одного имени может вызвать ошибки). - person Garry Pettet; 28.02.2010

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

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

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

NSSet *patientSet = listObject.patients;

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

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

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY lists.name == %@",listName];
person gerry3    schedule 24.02.2010
comment
В первом примере (который, как обычно, в gerry3), вы можете получить к нему доступ через KVC, не создавая подкласс с помощью NSSet *patientSet = [listObject valueForKey:@"patients"]; - person Marcus S. Zarra; 24.02.2010
comment
Но как преобразовать это в контроллер полученных результатов? У меня также есть тот же вопрос, и у меня есть ссылка на объект списка, но я хотел бы получить контроллер результатов, который показывает list.patients - person Nick; 27.08.2010
comment
На самом деле, неважно, ответ от @Garry ниже - это то, что я искал - person Nick; 27.08.2010

Десять лет спустя - еще немного информации!

Еще немного информации о фантастическом ответе @GarryPettet,

Допустим, у вас есть сущность CD_Person, и aPerson - одна из них. IE:

var aPerson: CDPerson

Допустим, у вас есть сущность CD_Pet

CD_Person имеет отношение .pets, которое является отношением "один ко многим" CD_Pet

Так что, чтобы быть ясным,

aPerson.pets

действительно является Набором сущностей CD_Pet.

Почти наверняка у вас будет поле id из вашего источника данных.

(Кроме того, .id должен быть Int64 в вашем основном объекте данных, даже если это меньшее значение int в ваших исходных данных)

Два пути!

ОБА это

let p = NSPredicate(format: "(ANY pets == %@)", aPerson )

И это

let p = NSPredicate(format: "(ANY pets.id == %lld)", aPerson.id)

... работают отлично, возможны оба варианта.

Так что есть два пути!

(PS: не забывайте, что lld .. @ не будет работать с Int64!)

Оба прекрасно работают в обычной ситуации, когда у вас есть отношения «многие ко многим».

person Fattie    schedule 11.03.2020