核心数据:谓词中的对象

Posted

技术标签:

【中文标题】核心数据:谓词中的对象【英文标题】:Core Data: object in a predicate 【发布时间】:2011-06-29 12:01:51 【问题描述】:

在我的核心数据对象模型中,我有 3 个具有适当关系的实体,因此 MyObject 可以有许多 MyObjectProperties,每个属性可以有一个 MyObjectPropertyImage。

给定一个 myObject,我想获取所有图像。

我尝试使用以下谓词来执行此操作,但是我得到一个空数组:

[NSEntityDescription entityForName:@"MyObjectPropertyImage" inManagedObjectContext:managedObjectContext];
[NSPredicate predicateWithFormat:@"ANY myObjectProperty.myObject == %@", myObject];

有什么想法吗?

【问题讨论】:

【参考方案1】:

使用 Core Data 时,最好将实体视为:对象图中的实体,而不是数据库中的表。因此,您不需要使用谓词获取与其他人相关的实体。相反,使用模型中定义的关系导航对象图。获取与myObject相关的所有图片:

// assuming the relationships are called 'myObjectProperties' and 'myObjectPropertyImage', respectively
NSSet *allImages = [myObject.myObjectProperties valueForKey:@"myObjectPropertyImage"];

请注意,如果您的对象图没有为您的myObject 实体加载到内存中,这可能会触发对数据库的额外访问。为避免这种情况,请确保在 myObject 的提取请求中设置预提取关系键路径。

我希望这会有所帮助...

【讨论】:

谢谢,完成了这项工作,是的,我仍然必须将“数据库思维”抛在脑后.. :)【参考方案2】:

由于您手头有一个MyObject 实例并且它具有myObjectProperties-->ObjectProperty-->>PropertyImages 的关系路径,您只需要遍历这些关系。使用valueForKeyPath: 很容易做到这一点

因此:

NSArray *images=[myObjectInstances valueForKeyPath:@"myObjectProperties.propertyImage"];

(注意:我的属性名称可能有误,但您可以理解。)

作为一般规则,您永远不会从图表中获取可用的对象。您获取以“挑选出与谓词匹配的对象的线程”,然后查找您遵循与相关对象的线程/关系的所有相关对象。

【讨论】:

感谢您的一般规则!这就是为什么我认为将托管对象放在谓词中没有多大意义

以上是关于核心数据:谓词中的对象的主要内容,如果未能解决你的问题,请参考以下文章

核心数据获取请求中需要谓词?

作为获取谓词的日期范围 - 核心数据之间的 NSDate 谓词

需要编写一个谓词来搜索核心数据对象数组属性中的日期(在我的例子中是日期数组)

核心数据获取谓词“不包含”?

核心数据 - 多对象谓词

核心数据中的谓词和组合过滤器?