谓词之间的问题

时间:2011-09-26 09:57:18

标签: iphone core-data nspredicate

当使用nspredicate(谓词之间)时,我有一个例外。

我使用的代码是:

NSMutableArray *returnedArray=[[[NSMutableArray alloc]init] autorelease];
NSManagedObjectContext *context = [self managedObjectContext]; 
NSEntityDescription *objEntity = [NSEntityDescription entityForName:@"Note" inManagedObjectContext:context];



NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:objEntity];


NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"When" ascending:YES];   

NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];   
[fetchRequest setSortDescriptors:sortDescriptors];   
[sortDescriptor release]; 



NSPredicate *predicate1 = [NSPredicate predicateWithFormat:
                          @"self.Reunion==%@",reunion];
NSNumber *endOfEtape=[NSNumber numberWithInt:[etape.positionDepart intValue]+[etape.duree intValue]];
NSExpression *s1 = [ NSExpression expressionForConstantValue: etape.positionDepart ];
NSExpression *s2 = [ NSExpression expressionForConstantValue: endOfEtape ];
NSArray *limits = [ NSArray arrayWithObjects: s1, s2, nil ];
 NSPredicate *predicate2=[NSPredicate predicateWithFormat: @"self.When BETWEEN %@",limits];

NSPredicate *predicate=[NSCompoundPredicate andPredicateWithSubpredicates:
                                [NSArray arrayWithObjects:predicate1,predicate2,nil]];
[fetchRequest setPredicate:predicate];


NSArray *notes; 
notes=[context executeFetchRequest:fetchRequest error:nil];

[fetchRequest release];

我在我调用“executeFetchRequest:”方法的行上有一个'objc_exception_throw'。

如果你能帮助我,我会很高兴的。 感谢。

1 个答案:

答案 0 :(得分:1)

不幸的是,BETWEEN操作数被认为是一个聚合函数& CoreData不支持这些。

请参阅Apple's Documentation

  

...考虑BETWEEN运算符(NSBetweenPredicateOperatorType);它的   右侧是包含两个元素的集合。使用正好   在Mac OS X v10.4 API中,这些元素必须是常量,就像它们一样   无法使用变量表达式填充它们。在Mac OS X v10.4上,   无法创建谓词模板   日期{$ YESTERDAY,$ TOMORROW};相反,你必须创建一个新的   每次都是谓词。

     

Core Data不支持聚合表达式。

所以你需要使用一个谓词:

NSPredicate *predicate2 = [NSPredicate predicateWithFormat: 
@"self.When >= %@ AND self.When <= %@", etape.positionDepart, endOfEtape];

(假设positionDepartendOfEtape的类型为NSString