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

Iphone 核心数据多对多关系谓词问题,iphone,cocoa,cocoa-touch,core-data,entity-relationship,Iphone,Cocoa,Cocoa Touch,Core Data,Entity Relationship,在我的核心数据模型中,我有两个实体:列表和患者。列表有一个名为“name”的属性 一个列表可以有任意数量的患者,每个患者可以属于任意数量的不同列表。因此,我在列表中设置了一个名为“患者”的关系,该关系与患者的多对多关系相反,在患者中设置了一个名为“列表”的关系,该关系与列表的多对多关系相反 我正在努力弄清楚的是如何创建一个谓词来选择属于特定列表名的所有患者 我该怎么办?我以前从未在核心数据中使用过关系。听起来您的数据模型如下: 名单病人 我认为如果你知道特定的列表名,那么你就知道特定的列表对象。

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

一个列表可以有任意数量的患者,每个患者可以属于任意数量的不同列表。因此,我在列表中设置了一个名为“患者”的关系,该关系与患者的多对多关系相反,在患者中设置了一个名为“列表”的关系,该关系与列表的多对多关系相反

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


我该怎么办?我以前从未在核心数据中使用过关系。

听起来您的数据模型如下:

名单病人

我认为如果你知道特定的列表名,那么你就知道特定的列表对象。如果是这样,您可以使用从列表到患者的to-many关系来抓取患者——这是一组患者对象。例如,如果列表与患者之间的关系命名为“患者”:

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

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


给定如下数据模型:

列出病人名单

您可以使用以下谓词在患者实体上查找属于具有特定名称的列表的所有患者实例:

[NSPredicate predicateWithFormat:@"ANY lists.name LIKE[cd] %@", listName]
假设
listName
是具有所需列表名的
NSString
实例<代码>与[cd]类似,不区分大小写,也不区分重音。

这似乎可以:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY lists == %@)", myList];
其中myList是一个实际的列表实体。

十年后,更多信息! 只是关于奇妙的@GarryPettet答案的更多信息

假设您有实体
CD\u Person
,而
aPerson
就是其中之一。即:

var aPerson: CDPerson
假设您有一个实体
CD\u Pet

CD\u个人
与宠物有一种一对多的关系
CD\u宠物

所以说清楚一点

aPerson.pets
确实是一组CD_宠物实体

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

(除此之外,.id在核心数据实体中必须是Int64,即使它在源数据中是较小的int)

有两条路要走! 这两个

let p = NSPredicate(format: "(ANY pets == %@)", aPerson )
还有这个

let p = NSPredicate(format: "(ANY pets.id == %lld)", aPerson.id)
。。。完美地工作,两者都是可能的。

所以有两条路要走

(注:别忘了lld…@对Int64不起作用!)


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

在第一个示例中(gerry3中通常是正确的),您可以通过KVC访问它,而无需使用
NSSet*patientSet=[listObject valueForKey:@“patients”]但如何将其“转换”为获取的结果控制器?我也有同样的问题,我确实有对“list”对象的引用,但我希望有一个显示“list.patients”的fetched results控制器实际上没有关系,下面@Garry的答案是我正在寻找的,我在内存中有list实体,并将其传递给UITableViewController子类。我如何构造一个获取请求来从该列表实体获取所有患者?我尝试使用NSFetchedResultsController,但列表的名称不是唯一的(因此仅基于名称构造谓词可能会导致错误)。
let p = NSPredicate(format: "(ANY pets == %@)", aPerson )
let p = NSPredicate(format: "(ANY pets.id == %lld)", aPerson.id)