2011-09-26 2 views
0

lors de l'utilisation d'un nspredicate (un entre les prédicats) j'ai eu une exception.problème avec le prédicat

il y a le code i utilisé:

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

et j'ai eu un 'objc_exception_throw' à la ligne sur laquelle j'appelle "executeFetchRequest:" méthode.

Je serai heureux si vous pouvez m'aider. Merci.

Répondre

1

Malheureusement, l'opérande BETWEEN est considérée comme une fonction d'agrégat &, qui ne sont pas supportées par CoreData.

Voir Apple's Documentation

... considèrent l'opérateur BETWEEN (NSBetweenPredicateOperatorType); son côté droit est une collection contenant deux éléments. En utilisant simplement l'API Mac OS X v10.4, ces éléments doivent être des constantes, car il n'y a aucun moyen de les remplir en utilisant des expressions variables. Sous Mac OS X v10.4, , il n'est pas possible de créer un modèle de prédicat à l'effet de date entre {$ YESTERDAY, $ TOMORROW}; à la place, vous devez créer un nouveau prédicat à chaque fois.

Les expressions agrégées ne sont pas prises en charge par les données de base.

Vous aurez besoin d'utiliser un prédicat comme:

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

(en supposant positionDepart et endOfEtape sont de type NSString)

+0

positinDepart et endOfType sont NSNumbers donc je pense que je devrais faire un nstring contenant la valeur des deux –

+0

, vous pouvez utiliser% d et obtenir la valeur int de NSNumber aussi ... de toute façon, il faudra unboxing. –