核心数据:谓词中的对象

时间:2011-06-29 12:01:52

标签: ios core-data nspredicate

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

给定myObject我想要获取所有图像。

我尝试使用以下谓词来做,但是我得到一个空数组:

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

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

由于您手头有MyObject个实例且关系路径为myObjectProperties-->ObjectProperty-->>PropertyImages,因此您只需要遍历关系。使用valueForKeyPath:

可以轻松完成此操作

所以:

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

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

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