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

29

在我的Core Data模型中,我有两个实体:List和Patient。List有一个名为'name'的属性。

一个List可以拥有任意数量的Patient,并且每个Patient可以属于任意数量的不同List。因此,在List上设置了一个名为'patients'的关系,该关系具有反向到多个Patient的关系,以及在Patient上设置了一个名为'lists'的关系,该关系具有到多个List的关系。

我现在遇到的难题是如何创建谓词来选择所有属于特定List名称的Patient。

我该如何做?我以前从未在Core Data中使用过关系。

4个回答

23

这似乎可以正常工作:

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

这里的myList是一个实际的List实体。


21

假设一个数据模型如下:

List <<——>> Patient

使用类似以下谓词的fetch请求,您可以找到属于具有特定名称列表的所有Patient实例:

[NSPredicate predicateWithFormat:@"ANY lists.name LIKE[cd] %@", listName]
假设 listName 是你所需的列表名称的一个 NSString 实例。 LIKE[cd] 进行的是不区分大小写和音标的比较。

我在内存中有一个List实体,并将其传递给UITableViewController子类。如何构建一个获取该列表实体中所有患者的fetch请求?我正在尝试使用NSFetchedResultsController,但列表名称不是唯一的(因此仅基于名称构建谓词可能会导致错误)。 - Garry Pettet

12

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

List <<-->> Patient

我认为如果你知道特定的列表名称,那么你也知道特定的列表对象。如果是这样的话,你可以通过从List到Patient的一对多关系获取患者 - 它是一组患者对象。例如,如果从List到Patient的关系被命名为"patients":

NSSet *patientSet = listObject.patients;
注意: 这需要创建你的托管对象的子类,以便你可以通过你的对象属性访问属性和关系。
如果出于某种原因你只知道列表名称,并且你正在获取病人对象,那么你可以使用从病人到列表的一对多关系(假设它被命名为“lists”而列表的名称在名为“listName”的字符串中)来创建谓词。
NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY lists.name == %@",listName];

4
在第一个例子中(像gerry3通常做得那样正确),您可以通过KVC访问它,而无需使用子类化,使用 NSSet *patientSet = [listObject valueForKey:@"patients"]; 即可。 - Marcus S. Zarra
2
但是如何将其“转换”为Fetched Results Controller呢?我也有同样的问题,并且我确实有对“list”对象的引用,但我想要一个显示“list.patients”的Fetched Results Controller。 - Nick
实际上不用了,下面@Garry的回答就是我要找的。 - Nick

7

十年后,一些更多的信息!

在@GarryPettet出色回答的基础上,我们提供一些更多的信息:

假设您有实体CD_PersonaPerson是其中之一。例如:

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上不起作用!)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接