开发者

problem with between predicate

when using an nspredicate ( a betwee开发者_如何学Gon predicate) i had an exception.

there is the code i used:

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

and i had an 'objc_exception_throw' at the line on which i call "executeFetchRequest:" method.

I will be happy if you can help me. Thanks.


Unfortunately, the BETWEEN operand is considered an aggregate function & these aren't supported by CoreData.

See Apple's Documentation

... consider the BETWEEN operator (NSBetweenPredicateOperatorType); its right hand side is a collection containing two elements. Using just the Mac OS X v10.4 API, these elements must be constants, as there is no way to populate them using variable expressions. On Mac OS X v10.4, it is not possible to create a predicate template to the effect of date between {$YESTERDAY, $TOMORROW}; instead you must create a new predicate each time.

Aggregate expressions are not supported by Core Data.

So you'll need to use a predicate like:

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

(assuming positionDepart and endOfEtape are of type NSString)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜