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

Dav*_*her 28 cocoa entity-relationship core-data objective-c

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

  • 百视达实体
    • DVD实体的To-Many关系.
  • DVD实体
    • title属性(字符串)
    • To-One与父Blockbuster实体的关系

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

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

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


我的问题是,我该如何形成NSFetchRequest它抓起DVD标题 "变形金刚2",这是一个孩子一鸣惊人 "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];
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lex 46

你可以在一个人中遍历关系NSPredicate.例如,你可以写类似的东西

[NSPredicate predicateWithFormat:@"title == %@ AND blockbuster.name LIKE \"Blockbuster C\"", @"Transformers 2"]
Run Code Online (Sandbox Code Playgroud)

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

[NSPredicate predicateWithFormat:@"title == %@ AND blockbuster IN %@", @"Transformers 2", setOfBlockbusters]
Run Code Online (Sandbox Code Playgroud)

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