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

29
我有一个如下配置的Core Data模型:
  • Blockbuster 实体
    • DVD 实体的多对多关系。
  • DVD 实体
    • title 属性(字符串)
    • 到父 Blockbuster 实体的一对一关系
单个 Blockbuster 内可以有多个 DVD(多对多)。每个 DVD 只能属于单个 Blockbuster(一对一)。
有多个 Blockbuster,有些可能包含与其他 Blockbuster 的 DVD 实体共享相同标题的 DVD 实体。例如,Blockbuster A 可能有一份 "Transformers 2" 的拷贝,Blockbuster CBlockbuster G 也是如此。假设没有任何 Blockbuster 有超过一个同名电影的拷贝。
我想从 Blockbuster C 中获取 Transformers 2 DVD。我不想要来自 Blockbuster AG 的复制品,因为我的上司经常去那里,我只能在 Blockbuster C 拷贝这部垃圾片。
我的问题是,如何形成一个 NSFetchRequest,以获取具有标题 "Transformers 2" 的 DVD,它是父实体为 Blockbuster "C" 的子实体?
这种类型的请求将抓取所有 "Transformer 2" DVD,但不会抓取特定于 Blockbuster C 实体的那一个:
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中传递一个相关对象的Object ID,并根据它进行过滤?
1个回答

47

您可以在 NSPredicate 中遍历关系。例如,您可以编写类似于以下内容的代码:

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

现在,如果你没有可比较的属性并且需要检查实际对象,则可以使用以下方法:

[NSPredicate predicateWithFormat:@"title == %@ AND blockbuster IN %@", @"Transformers 2", setOfBlockbusters]
完整的语法在这里有记录。但是setOfBlockbusters可以是一个集合、数组或字典(如果是字典,则使用值而不是键)。

非常感谢,解决了!还有感谢提供文档链接,非常有帮助。 :) - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接