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

Gar*_*tet 21 iphone cocoa cocoa-touch entity-relationship core-data

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

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

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

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

谢谢,

Bar*_*ark 19

给定一个数据模型:

清单<< - >>患者,

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

[NSPredicate predicateWithFormat:@"ANY lists.name LIKE[cd] %@", listName]
Run Code Online (Sandbox Code Playgroud)

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


Gar*_*tet 16

这似乎工作正常:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY lists == %@)", myList];
Run Code Online (Sandbox Code Playgroud)

其中myList是实际的List实体.


ger*_*ry3 11

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

列表<< - >>患者

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

NSSet *patientSet = listObject.patients;
Run Code Online (Sandbox Code Playgroud)

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

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

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY lists.name == %@",listName];
Run Code Online (Sandbox Code Playgroud)

  • 在第一个例子中(通常来自gerry3是正确的),你可以通过KVC访问它,而不必使用`NSSet*patientSet = [listObject valueForKey:@"patients"]来子类化它; (4认同)
  • 但是如何将其"转换"为Fetched结果控制器?我也有同样的问题,我确实有"list"对象的引用,但我想有一个显示"list.patients"的获取结果控制器 (2认同)

Fat*_*tie 5

十年后,更多信息!

关于精彩的@GarryPettet 答案的更多信息,

假设您有实体CD_Person并且aPerson是其中之一。IE:

var aPerson: CDPerson
Run Code Online (Sandbox Code Playgroud)

假设你有一个实体 CD_Pet

CD_Person有一个.pets一对多的关系CD_Pet

所以只是要清楚,

aPerson.pets
Run Code Online (Sandbox Code Playgroud)

确实是一组 CD_Pet 实体。

几乎可以肯定,您将拥有一个来自数据源的 id 字段。

(另外, .id在您的核心数据实体中必须是Int64,即使它在源数据中是一个较小的 int)

两条路走!

这两个

let p = NSPredicate(format: "(ANY pets == %@)", aPerson )
Run Code Online (Sandbox Code Playgroud)

和这个

let p = NSPredicate(format: "(ANY pets.id == %lld)", aPerson.id)
Run Code Online (Sandbox Code Playgroud)

...工作完美,两者都是可能性。

所以有两条路可走!

(PS:不要忘记 lld .. @ 不适用于 Int64!)

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