如何使用 NSPredicate 捕获子对象?

Posted

技术标签:

【中文标题】如何使用 NSPredicate 捕获子对象?【英文标题】:How to use NSPredicate to catch child objects? 【发布时间】:2010-03-11 00:41:10 【问题描述】:

我是核心数据的新手,我尝试通过一个查询来获取各种类型的所有子对象。假设有一个“动物”类型作为父母,“猫”、“狗”和“鸟”作为孩子。我想同时获得猫和狗,但不是作为 Animal 对象返回的单个查询中的 Birds。是否可以?

【问题讨论】:

【参考方案1】:

Managed objects have an entity property,因此您应该能够将Kevin Sylvestre's solution 与a predicate 的entity.name != "Bird" 结合起来。

【讨论】:

这是一个非正式的属性,只要您可以使用 KVC 来访问它(因为那里有一个方法),而不是正式的 (@property) 属性。 您实际上不能将此方法用于 SQLite 存储,因为当对象出现故障时,entity 属性不可用。您别无选择,只能执行获取后过滤步骤。【参考方案2】:

是的,有可能:

// Load delegate from application and context from delegate.
SampleAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = delegate.managedObjectContext;

// Create new request.
NSFetchRequest *request = [[NSFetchRequest alloc] init];

// Create entity description using delegate object context.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Animal" inManagedObjectContext:context];

// Set entity for request.
[request setEntity:entity];
[request setIncludesSubentities:YES];

// Load array of documents.
NSError *error;
NSArray *animals = [context executeFetchRequest:request error:&error];

// Release request.
[request release];

// Access array.
for (id animal in animals)  

【讨论】:

感谢您的快速响应。对不起,我忘了提最重要的事情:还有一个孩子(比如“鸟”)。我需要的是,得到猫和狗,但不是鸟。我已经编辑了主要问题【参考方案3】:

虽然这 (entity.name != "Bird") 在您只有“Cat”、“Dog”和“Bird”时可能会起作用,但如果您稍后添加更多“Animals”则不起作用。你也可以使用entity.name == "Dog" && entity.name == "Cat"

这是一个案例“......你还有其他的吗,动物们?”

玩得开心 =)

【讨论】:

以上是关于如何使用 NSPredicate 捕获子对象?的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSPredicate 删除对象

如何搜索核心数据子对象

一个可以递归遍历对象图的 NSPredicate?

如何通过 NSPredicate 过滤 Core Data 托管对象?

如何在 NSPredicate 的帮助下使用自定义对象数组实现搜索?

如何序列化 NSPredicate 对象?