Iphone 关于NSFetchRequest和关系的快速问题

Iphone 关于NSFetchRequest和关系的快速问题,iphone,objective-c,xcode,nsfetchedresultscontroller,Iphone,Objective C,Xcode,Nsfetchedresultscontroller,在我的核心数据模型中,我有一个实体会话和练习 课时与练习有一对多的关系,也有一对一的反比关系 在我的获取中,我试图找到与当前练习相关的所有会话对象 我正在使用以下不起作用的代码 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setPredicate:[NSPredicate predicateWithFormat: @"exercise = %@", exercise.name]]; NSE

在我的核心数据模型中,我有一个实体会话和练习

课时与练习有一对多的关系,也有一对一的反比关系

在我的获取中,我试图找到与当前练习相关的所有会话对象

我正在使用以下不起作用的代码

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat: @"exercise = %@", exercise.name]];
NSEntityDescription *sessionEntity = [NSEntityDescription entityForName:@"Session" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:sessionEntity];

NSError *error = nil;
NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
NSLog(@"Fetch error: %@", error);
self.sessionArray = results;
以下是我的数据模型:


在谓词中使用=,==是比较运算符。我想这就是你错的地方


来源:

首先,从屏幕截图上看,会话实体的关系属性似乎称为练习而不是练习

另外,在我看来,如果您搜索的不是会话实体而是练习实体,然后遍历生成的数组以提取会话,那么它将起作用

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:"name == %@", exerciseName]];
NSEntityDescription *exerciseEntity = [NSEntityDescription entityForName:@"Exercise" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:exerciseEntity];
...    
NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
...
NSMutableArray *mutableSessionArray = [NSMutableArray array];
for (Exercise *ex in results) {
    Session *session = [ex exercises];
    if (session) [mutableSessionArray addObject:session];
}
self.sessionArray = [NSArray arrayWithArray:mutableSessionArray];
为了清楚起见,称为练习的练习实体之间的关系可以称为会话。我建议将其重命名

顺便说一句,你也可以写=而不是==,据我所知,它们是等价的。在报告中说:


谢谢Mundi,但我正在尝试获取一个数组,其中包含所有会话,其中存在一个名为exercise.name的练习。@Faisal,没错。我会这样做的。每个生成的练习都有一个与之关联的课时。是的,但如何从中获得一系列课时?我知道Session*Session=exerciseVariable.exercises;能给我一个会话吗?@Faisal:我会把代码写进答案中以便于格式化。我想你缺少[fetchRequest setEntity:sessionEntity];
=, ==
The left-hand expression is equal to the right-hand expression.