29

我有一个这样的核心数据模型设置:

  • 大片实体
    • 与DVD实体的多对多关系。
  • DVD实体
    • 标题属性(字符串)
    • 与父Blockbuster实体的一对一关系

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

有多个 Blockbuster,有些可能包含与其他 Blockbuster 的 DVD 实体具有相同标题的 DVD 实体。例如,Blockbuster A可能有《变形金刚 2》的副本,Blockbuster CBlockbuster G也有。让我们假设没有一个百视达拥有超过一份同名电影的副本。

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


我的问题是,如何形成一个 NSFetchRequest 来获取标题为“Transformers 2”的DVD Blockbuster “C”父实体的子实体?

这种类型的请求将获取所有“变形金刚 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,并基于此进行过滤?

4

1 回答 1

47

您可以遍历NSPredicate. 例如,您可以编写类似

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

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

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

The full syntax is documented here. But setOfBlockbusters could be a set, an array, or a dictionary (if it's a dictionary, the values, not the keys, are used).

于 2009-10-06T21:13:22.000 回答