在谓词中评估 CoreData 实体类型

Posted

技术标签:

【中文标题】在谓词中评估 CoreData 实体类型【英文标题】:Evaluate CoreData entity type in predicate 【发布时间】:2013-05-03 14:48:45 【问题描述】:

我有一个我精心设计的块谓词,只是发现你不能在 Core Data 中使用它们。

NSPredicate *rootContactPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) 

        BOOL isPersonAndRoot = ([[[evaluatedObject entity] name] isEqualToString:@"Person"] && [[(Person*)evaluatedObject accounts] count] == 0);
        BOOL isAccountAndRoot = ([[[evaluatedObject entity] name] isEqualToString:@"Account"] && [(Account*)evaluatedObject root] == nil);

        return isPersonAndRoot || isAccountAndRoot;
    ];

所以我需要将其转换为标准的字符串格式谓词,但我不清楚如何检查评估对象的实体类型。 PersonAccount 实体是 Contact 实体的子类,这是在获取请求中评估的类型。我希望它能看到子类型。

【问题讨论】:

【参考方案1】:

像这样检查实体:

[NSPredicate predicateWithFormat:@"self.entity = %@", Person.entity];

【讨论】:

【参考方案2】:

根据 malhal 的建议,使用 NSManagedObject 的实体属性检查实体类型的 Swift 4.0 方法。

let entityDescription = NSEntityDescription.entity(forEntityName: "Account", in: managedObjectContext)!
return NSPredicate(format: "entity = %@", entityDescription)

【讨论】:

这成功了!在从父抽象实体中获取格式为“实体 %@” 的值时,我使用它来排除特定的子实体 @aleksey 你能用代码提供吗?如果有一个更复杂的答案来帮助解构正在发生的事情,那就太好了。【参考方案3】:

现在您似乎可以简单地比较谓词中的实体,提供托管对象实体作为值:

"entity = %@"

以前:

你不能。原因是谓词需要进行转换,以便它可以在底层数据存储(可能是 SQLite)上运行。 SQLite 数据库没有关于元素类型的任何数据,它只知道对象的键和值。

根据您要执行的操作,您可能需要针对超级实体中已知的键运行单个提取请求。或者您需要 2 个获取请求,分别执行,然后合并 2 个结果集。

【讨论】:

我希望 entity.name 会解析为某些东西......它没有。 这是模型中保存的数据(与应用程序一起编译)与 SQLite 文件中保存的数据之间的差异...... mahal 下面的建议效果很好。 Stuart Pattison 的 Swift 版本也是如此。在从父抽象实体获取值时,我用它来排除特定的子实体。

以上是关于在谓词中评估 CoreData 实体类型的主要内容,如果未能解决你的问题,请参考以下文章

获取CoreData中所有实体的所有子实体

如何通过在 ios 中结合个人实体的名字和姓氏来对全名应用谓词

基于实体属性确保 CoreData 实体唯一的最佳实践

核心数据:返回另一个实体的对象的谓词

以字典为属性的实体的谓词

使用谓词搜索核心数据实体