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

问题描述 投票:21回答:4

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

列表可以有任意数量的患者,每个患者可以属于任意数量的不同列表。因此,我在List上设置了一个与“患者”成反比的关系,称为“患者”,而在Patient上设置了一个与List进行了一对多的关系。

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

我将如何处理?我以前从未在Core Data中使用过关系。

iphone cocoa cocoa-touch core-data entity-relationship
4个回答
19
投票

给出类似的数据模型:

列表<< ---- >>患者,

您可以使用谓词(例如:找到带有特定名称的列表的所有Patient实例,并通过获取请求在Patient实体上找到它们]

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

假设listName是具有所需列表名称的NSString实例。 LIKE[cd]进行不区分大小写和不区分音素的比较。


17
投票

这似乎可以正常工作:

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

其中myList是实际的List实体。


12
投票

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

列表<>患者

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

NSSet *patientSet = listObject.patients;

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

[如果您仅出于某种原因知道列表名称,并且正在获取Patient对象,则可以使用Patient至List之间的多对多关系来创建谓词(假设它的名称为“ lists”,并且列表名称以字符串形式名为“ listName”):

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

0
投票

十年后,更多信息!

仅提供有关出色的@GarryPettet答案的更多信息,

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

假设您有实体CD_Pet

[CD_Person具有一对多.pets]的关系[C0

几乎可以肯定,您将有一个来自数据源的id字段(此外,.id必须是核心数据实体中的Int64,即使它在源数据中是较小的int)

两种方法!

两者都

CD_Pet

和此

let p = NSPredicate(format: "(ANY pets == %@)", aPerson )

((PS:不要忘记lld .. @在Int64上将不起作用!)

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

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

© www.soinside.com 2019 - 2024. All rights reserved.