Основные данные - разрыв отношений - PullRequest
3 голосов
/ 21 марта 2010

У меня есть объект Patient и объект List.Пациент может принадлежать к нескольким различным спискам, и в списке может быть несколько разных пациентов.

Скажем, у меня есть пациент, который принадлежит к 3 спискам (A, B, C).Я хочу удалить пациента из списков A и B. Я не хочу удалять списки A & B сами, хотя, очевидно.Как мне это сделать?

Ответы [ 2 ]

8 голосов
/ 21 марта 2010

Хотя ответ Тима, приведенный выше, технически верен, для меня это выглядит как небольшой код.

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

id myPatient = ...;
id myList = ...;
[[myPatient mutableSetValueForKey:@"lists"] removeObject:myList];

Это, конечно, предполагает, что ваши отношения двунаправлены. Если это не так, я настоятельно рекомендую вам сделать их двунаправленными.

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

[[myList mutableSetValueForKey:@"patients"] removeObject:myPatient];

обновление

Тогда код еще проще:

[myPatient setLists:nil];

Это удалит пациента из всех списков.

1 голос
/ 21 марта 2010

Итак, чтобы смоделировать это отношение, у вас есть отношение «многие ко многим» между пациентом и списком.Предположим, что в Базовых данных это представлено отношением patients в Списке с обратным отношением lists для Пациента.Кроме того, давайте предположим, что у List есть какое-то свойство name с именем списка, как NSString.

Чтобы «разорвать» отношения (удалить пациента из некоторых списков), вам придетсяимейте ссылку на NSManagedObject пациента, который должен быть удален, и списки, из которых вы хотите удалить этого пациента.Затем все, что остается сделать, это получить изменяемый набор пациентов для каждого списка и удалить нужного пациента:

// Assuming you have some PatientManagedObject *patient:
NSSet *patientLists = [patient lists]; // Set of ListManagedObjects
for(ListManagedObject list in patientLists) {
    if([[list name] isEqualToString:@"A"] || [[list name] isEqualToString:@"B"]){
        // Now you have to build the set of patients without this patient
        NSMutableSet *listPatients = [list mutableSetValueForKey:@"patients"];
        [listPatients removeObject:patient];
    }
}

Для получения дополнительных данных см. соответствующую документацию по основным данным .

...