如何根据属性和关系创建过滤Core Data对象的NSFetchRequest?

时间:2009-10-06 20:34:31

标签: objective-c cocoa core-data entity-relationship

我的核心数据模型设置如下:

  • Blockbuster 实体
    • DVD 实体的To-Many关系。
  • DVD 实体
    • 标题属性(字符串)
    • 与父 Blockbuster 实体
    • 的To-One关系

单个Blockbuster内部可以有多个DVD(To-Many)。每张DVD只能是单个Blockbuster(To-One)的一部分。

有多个Blockbuster,有些可能包含与其他Blockbuster的DVD实体共享相同标题的DVD实体。例如, Blockbuster A 可能有“变形金刚2”的副本, Blockbuster C Blockbuster G 也是如此。让我们假装没有Blockbuster拥有同一部电影的多个副本。

我有兴趣从 Blockbuster C 中获取变形金刚2 DVD。我不想要 Blockbuster A G 的副本,因为我的老板经常光顾那里,我只能在 Blockbuster中烧掉这片垃圾。 ç


我的问题是,我如何形成一个NSFetchRequest,用标题“变形金刚2”抓取 DVD ,这是 Blockbuster <的一个孩子/ strong>“C”父实体?

此类请求将获取所有“Transformer 2”DVD,但不是特定于Blockbuster C实体的DVD:

NSManagedObjectContext *moc = [self managedObjectContext];

NSString *aTitle = @"Transformers 2";
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@", aTitle];
[request setEntity:[NSEntityDescription entityForName:@"DVD" inManagedObjectContext:moc]];
[request setPredicate:predicate];

NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];

// error handling code
[request release];

有没有办法传递NSPredicate中相关对象的对象ID,基于此进行过滤?

1 个答案:

答案 0 :(得分:46)

您可以在NSPredicate中遍历关系。例如,您可以编写类似

的内容
[NSPredicate predicateWithFormat:@"title == %@ AND blockbuster.name LIKE \"Blockbuster C\"", @"Transformers 2"]

现在,如果您没有要比较的属性,并且需要检查实际对象,那么您可以使用类似

的内容
[NSPredicate predicateWithFormat:@"title == %@ AND blockbuster IN %@", @"Transformers 2", setOfBlockbusters]

完整语法记录为here。但setOfBlockbusters可以是集合,数组或字典(如果它是字典,则使用值,而不是键)。