关于NSFetchRequest和关系的快速问题

时间:2011-06-05 21:04:17

标签: iphone objective-c xcode nsfetchedresultscontroller

在我的核心数据模型中,我有一个实体Session和Exercise。

Session与Exercise有很多关系(也有一对一的反向关系)。

在我的fetch中,我试图找到与当前练习相关的所有Session对象。

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

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;

这是我的数据模型:

enter image description here

2 个答案:

答案 0 :(得分:0)

在谓词中使用=,==是比较运算符。我认为那是你出错的地方。

来源:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSPredicate_Class/Reference/NSPredicate.html

答案 1 :(得分:0)

首先,从截图中看来,Session实体的关系属性似乎是exercises而不是exercise

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

[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];

为清楚起见,名为exercises的练习实体的关系可称为session。我建议重命名它。

顺便说一句,你也可以写=代替==,据我所知,它们是等价的。在Predicate Programming Guide section on Predicate Format String Syntax中它说:

=, ==
The left-hand expression is equal to the right-hand expression.