2010-09-05 4 views
4

Est-ce que quelqu'un pourrait m'aider à définir un prédicat qui renvoie uniquement la longueur de l'attribut "letters" de NSManagedObject dans une certaine plage?NSPredicate pour la longueur d'un attribut de chaîne de NSManagedObject

Voici l'exemple que j'ai essayé, j'ai l'impression que c'est la notation letters.length, j'ai aussi essayé les lettres kvc. @ Longueur sans succès .. Qu'est-ce que je fais mal?

NSManagedObjectContext *context = ...; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Word" inManagedObjectContext:context]; 
[fetchRequest setEntity:entity]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"letters" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"letters.length BETWEEN %@", [NSArray arrayWithObjects: [NSNumber numberWithInt:5], [NSNumber numberWithInt:20], nil]]; 
[fetchRequest setPredicate:predicate]; 

NSUInteger limit = 20; 
[fetchRequest setFetchLimit:limit]; 

NSError *error = nil; 
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; 

Répondre

6

Je ne sais pas comment ce bout de code est ici sage performance, mais est ma réponse à votre question:

NSString *attributeName = @"letters"; 
NSString *attributeValue = [NSString stringWithFormat:@".{%d,%d}", 5, 20]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K MATCHES %@", attributeName, attributeValue]; 
[fetchRequest setPredicate:predicate]; 

Joss.

+3

Ceci devrait être la réponse acceptée. –

4

J'ai de mauvaises nouvelles. Tu ne peux pas faire ça. Il n'y a pas d'attribut de longueur pour les chaînes dans le NSPredicate (que j'ai pu trouver).

Ce que je vous recommande de faire est d'ajouter un attribut pour la longueur de la chaîne stockée dans votre objet géré qui est défini lorsque vous définissez l'attribut lettres. Vous pouvez ensuite effectuer votre requête sur cet attribut et renvoyer les valeurs souhaitées.

+0

Merci Joshua. D'accord. – jbg

3

Dans le cas où quelqu'un est à la recherche d'un moyen de tester si une chaîne a une longueur à l'aide d'un NSPredicate, il est possible.

+3

Méfiez-vous que la solution que vous avez liée ne fonctionne pas avec les données de base, comme le demande l'OS. –

Questions connexes