核心数据多对多关系 - 谓词问题

时间:2010-02-24 18:45:10

标签: iphone cocoa cocoa-touch core-data entity-relationship

在我的核心数据模型中,我有两个实体:列表和患者。 List有一个名为'name'的属性。

列表可以包含任意数量的患者,每个患者可以属于任意数量的不同列表。因此,我在名单上设置了一个名为“患者”的关系,该关系与患者具有反向关系,患者之间的关系称为“列表”,与列表具有多对多的关系。

我正在努力弄清楚如何创建一个谓词,它将选择属于特定列表名称的所有患者。

我该怎么做?我之前从未在Core Data中使用过关系。

谢谢,

4 个答案:

答案 0 :(得分:19)

给出如下数据模型:

列表<< - >>患者,

您可以使用谓词来查找属于具有特定名称的列表的所有患者实例,并在患者实体上使用获取请求:

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

假设listName是具有所需列表名称的NSString实例。 LIKE[cd]做了一个不区分大小写且不区分大小写的比较。

答案 1 :(得分:15)

这似乎工作正常:

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

其中myList是实际的List实体。

答案 2 :(得分:10)

听起来你的数据模型就是这样:

列表<< - >>患者

我认为如果您知道特定的列表名称,那么您就知道特定的列表对象。如果是这样,您可以使用从列表到患者的多对多关系来抓住患者 - 这是一组患者对象。例如,如果从列表到患者的关系被命名为“患者”:

NSSet *patientSet = listObject.patients;

注意:这要求您为托管对象创建子类,以便可以将属性和关系作为对象的属性进行访问。

如果由于某种原因只知道列表名称,并且您正在获取Patient对象,那么您可以使用Patient到List中的to-many关系创建谓词(假设它名为“lists”,列表中的名称为名为“listName”的字符串):

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

答案 3 :(得分:4)

十年后,更多信息!

有关神奇的@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!)

在具有“多对多”关系的常见情况下,两者都可以正常工作。