【问题标题】:A Core Data Predicate to check if child Entities contain an attribute or "keypath"?用于检查子实体是否包含属性或“keypath”的核心数据谓词?
【发布时间】:2011-12-16 22:49:22
【问题描述】:

我正在目标 c 中构建一个核心数据 NSFetchRequest。在数据模型中,有一个抽象的父实体(它包含 4 个基本属性),以及许多不同的子实体,其中包括父实体中没有的属性。一些子项包含共享相同名称和数据类型的属性。

我将 fetchRequest 应用到父实体,以便它搜索子实体的所有实例以查看是否存在“keypath”。

我可以构造一个只返回包含特定属性的子实体的谓词吗?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ IN self.entityAttributes",attribute.name];

这里,attribute 是 NSAttributeDescription 的一个实例,目标是在其属性列表中搜索具有匹配名称的属性的其他实体,但我不知道如何格式化谓词。

如果需要,我可以进一步澄清。谢谢!

【问题讨论】:

    标签: objective-c ios inheritance core-data nspredicate


    【解决方案1】:

    您检查实例而不是模型是否有原因?您可以轻松找出哪些实体类型具有给定属性

    for (NSEntityDescription* entityDescription in [self managedObjectModel]) {
      if ([[entityDescription propertiesByName] objectForKey:@"someProperty"] != nil) {
        // objects of this entity support the property you're looking for
      }
    }
    

    【讨论】:

    • 我需要查询实例,因为最终目标是从所有定义它的实例中获取属性的不同值。我正在使用与您在此处列出的循环类似的循环,以便为 Wienke 建议的解决方法生成索引表。
    • 实际上,我认为您应该接受 edsko 的建议。当他的代码中的if 条件为真时,您将获得实体描述,该实体描述将收集具有您想要的属性的所有实例。您只需在没有谓词的情况下对该实体描述运行 fetch,就可以了。它的美妙之处在于,如果您只需要该属性具有特定值的实例,您可以为它们添加一个谓词到 fetch。 (谢谢你们俩:我不知道你可以直接从妈妈那里得到这么多信息。)
    • 如果您追求的是性能,那么也许您应该重新考虑一下您的数据库模型。 Core Data 会将不同的实体存储在不同的数据库表中,因此即使您提出一个跨实体工作的复杂查询,它也可能不会很好地执行。也许您最好将属性添加到父实体中,然后在不需要它的子实体中将其不使用。
    【解决方案2】:

    有趣的问题,值得做一些实验(在没有更好的帮助的情况下)。

    我在一个托管对象上尝试了这个谓词:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.attributesByName.allKeys CONTAINS %@", @“nameOfAttrSought”];
    

    但我得到了这个错误:“未实现的谓词 SQL 生成。”

    这表明 SQL 还没有准备好深入研究 NSArray,这是通过查询 NSEntityDescription 的属性名称得到的。

    如果没有其他人能想出一个谓词来通过直接获取请求执行您想要的操作,我建议使用以下解决方法:

    定义一个实体 Namer,它有一个字符串 attr named 和一对多关系 members。为您的目标子实体可以拥有的每个可能的属性创建其中一个。 然后给子实体一个与Namer 的一对多关系,称为namersmembers 关系的逆)。插入后,将适当的“名称”添加到此关系中。 然后你可以像这样创建一个 fetch 谓词:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@“ANY namers == %@“, namerSought];
    // ("namerSought" is an instance of Namer.)
    

    【讨论】:

    • 我也遇到了这个错误。当我尝试使用父实体中未定义的属性时,它似乎不喜欢。另外,我决定使用与您在此处描述的几乎完全相同的方法。这绝对不是理想的解决方案,我希望有人可能知道我们不知道的技巧。否则,我会在一天左右的时间内将此标记为已回答。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多