核心数据 - 打破关系

时间:2010-03-21 08:35:59

标签: iphone objective-c xcode core-data entity-relationship

我有一个Patient实体和一个List实体。患者可以属于几个不同的列表,列表可以有几个不同的患者。

假设我的病人属于3个名单(A,B,C)。我想将病人从名单A& B.我不想删除列表A& B本身虽然很明显。我该怎么做呢?

2 个答案:

答案 0 :(得分:8)

虽然蒂姆上面的回答在技术上是正确的,但对我来说似乎有点相当多的代码。

我认为要从列表中删除患者,您已经知道该列表并在您想要移除患者时对其进行引用。因此,代码可以简单如下:

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

这当然是假设您的关系是双向的。如果他们不是那么我强烈建议你使它们双向。

最后,因为这是多对多的关系,所以你可以在任何一个方向执行上面的代码。

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

更新

然后代码更简单:

[myPatient setLists:nil];

这将从所有名单中删除患者。

答案 1 :(得分:1)

因此,为了模拟这种关系,患者和列表之间存在多对多的关系。假设在核心数据中,这由列表上的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];
    }
}

有关更多数据,请参阅the relevant Core Data documentation