【问题标题】:Core data many-to-many relationship - Predicate question核心数据多对多关系 - 谓词问题
【发布时间】:2011-01-20 16:16:31
【问题描述】:

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

一个列表可以有任意数量的患者,每个患者可以属于任意数量的不同列表。因此,我在 List 上设置了一个名为“患者”的关系,该关系与 Patient 具有反向多对关系,并且在 Patient 上设置了一个名为“lists”的关系,与 List 具有一对多关系。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    列表>患者

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

    NSSet *patientSet = listObject.patients;
    

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

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

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

    【讨论】:

    • 在第一个示例中(与 gerry3 中的往常一样正确),您可以通过 KVC 访问它,而无需使用 NSSet *patientSet = [listObject valueForKey:@"patients"]; 对其进行子类化
    • 但是您如何将其“转换”为 Fetched 结果控制器?我也有同样的问题,我确实有对“list”对象的引用,但我想要一个显示“list.patients”的获取结果控制器
    • 其实没关系,下面@Garry 的答案正是我想要的
    【解决方案2】:

    给定如下数据模型:

    列表>患者,

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

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

    假设 listName 是一个具有您想要的列表名称的 NSString 实例。 LIKE[cd] 进行不区分大小写和不区分变音符号的比较。

    【讨论】:

    • 我在内存中有 List 实体,并将它传递给 UITableViewController 子类。我将如何构造一个获取请求以从该列表实体中获取所有患者?我正在尝试使用 NSFetchedResultsController 并且列表的名称不是唯一的(因此仅基于名称构造谓词可能会导致错误)。
    【解决方案3】:

    这似乎工作正常:

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

    其中 myList 是一个实际的 List 实体。

    【讨论】:

      【解决方案4】:

      十年后,更多信息!

      更多关于@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!)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-30
        • 1970-01-01
        • 2013-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多