ios - CoreData:NSFetchedResultsController一对多对多关系

标签 ios objective-c core-data nspredicate

我在应用程序上工作时使用核心数据,而核心数据对象如下所示:

给TheaterName和genreName我想显示actorsName。有谁知道一种创建NSPredicate的方法吗?

最佳答案

您可以使用SUBQUERY来构建NSPredicates,它们深入到“许多”关系中:

    // Set predicate
NSPredicate *requestPredicate = [NSPredicate predicateWithFormat:@"SUBQUERY(genres, $g, ANY $g.movies.name == %@).@count != 0",  @"Batman vs Superman"];
[fetchRequest setPredicate:requestPredicate];

更新

根据更新后的示例,您将需要以下嵌套子查询:
 NSPredicate *requestPredicate = [NSPredicate predicateWithFormat:@"SUBQUERY(movies, $m, ANY $m.genres.name == %@).@count != 0 AND SUBQUERY(movies, $m, SUBQUERY($m.genres, $g, ANY $g.theaters.name == %@).@count != 0).@count != 0", @"Action", @"Harkins"];

这是一个示例Cast实体提取:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Cast" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
// Set predicate
NSPredicate *requestPredicate = [NSPredicate predicateWithFormat:@"SUBQUERY(movies, $m, ANY $m.genres.name == %@).@count != 0 AND SUBQUERY(movies, $m, SUBQUERY($m.genres, $g, ANY $g.theaters.name == %@).@count != 0).@count != 0", @"Action", @"Harkins"];
[fetchRequest setPredicate:requestPredicate];
// Fetch
NSError *error = nil;
if (![aFetchedResultsController performFetch:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
// Check fetched objects
NSArray *fetchedObjects = [aFetchedResultsController fetchedObjects];
for (Cast *eachCast in fetchedObjects) {
    NSLog(@"Each Cast name: %@", eachCast.name);
}

只需将@“Action”替换为所需的流派名称,并将@“Harkins”替换为Theatre名称。

这是我设置核心数据模型的方法:

关于ios - CoreData:NSFetchedResultsController一对多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30585275/

相关文章:

swift - 核心数据 : Failed to find a unique match for an NSEntityDescription

ios - 从 Swift 的 TimeInterval 中删除时间组件?

ios - 是否可以将类型删除应用于协议(protocol)中的返回值?

ios - 如何在 self.dismiss block 中推送 UIViewController?

ios - 如果相应的按钮是 NSArray 的元素,如何访问或分配 UIButton 标签?

ios - iOS 自动下载文件

IOS KeyChainWrapper 存储后值为 nil

iphone - 将 NSDate 转换为 mm/dd/yyyy

objective-c - 从 NSFetchedResultsController 检测 sectionNameKeyPath 的更新

ios - 应用重启后核心数据为空