1

j'ai créé des catégories de NSManagedObject telles que créer, comte et d'autre. Toutes les œuvres trouvent à l'exception des suivantesNSPredicate créé avec le format et va_list/NSArray échoué, mais le succès de la chaîne

@interface NSManagedObject(ManagedObjectExtension) 
+ (id)findWithPredicate:(id)stringOrPredicate, ...; 
@end 

@implementation NSManagedObject(ManagedObjectUtilities) 

+ (id)findWithPredicate:(id)stringOrPredicate, ... { 
    NSFetchRequest *fetchRequest = [self allFetchRequest]; 
    if (stringOrPredicate) { 
     NSPredicate *predicate; 
     if ([stringOrPredicate isKindOfClass:[NSString class]]) { 
      va_list variadicArguments; 
      va_start(variadicArguments, stringOrPredicate); 
      predicate = [NSPredicate predicateWithFormat:stringOrPredicate arguments:variadicArguments]; 
      va_end(variadicArguments); 
     } else { 
      predicate = (NSPredicate *)stringOrPredicate; 
     } 
     [fetchRequest setPredicate:predicate]; 
    } 


    NSError *error; 
    NSArray *results = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error]; 

    if (error) { 
     NSLog(@"%@", [error description]); 
    } 

    if ([results count] == 0) { 
     return nil; 
    } else if ([results count] == 1) { 
     return [results objectAtIndex:0]; 
    } else { 
     return results; 
    } 
} 

@end 

Et ce sont des résultats

NSString *email = [NSString stringWithString:someTextField.text]; 
NSLog(@"%@", [User findWithPredicate:@"email == "%@", email]); 
==> (null) 
NSLog(@"%@", [User findWithPredicate:[NSString stringWithFormat:@"email == "%@", email]]); 
==> "<User: 0x1d827e10> ..." 

Fondamentalement, cette méthode ne fonctionne que lorsque j'envoie une chaîne au lieu de chaîne formatée et arguments. Si j'imprime le prédicat créé à l'intérieur de cette méthode, ce sont des résultats

[User findWithPredicate:@"email == "%@", email]; 
==> email == "%@" 
[User findWithPredicate:[NSString stringWithFormat:@"email == "%@", email]]; 
==> email == "[email protected]" 

Avez-vous une idée de ce qui pourrait causer cette erreur? Tout commentaire ou suggestion sont les bienvenus:)

+1

est-ce une faute de frappe: @ "email =="% @ " devrait-il être: @" email == '% @' " – kitschmaster

+0

@kitschmaster Merci, c'est simple comme ça, supprimer guillemet simple résoudre le problème. –

Répondre

2

Je suppose que vous avez oublié les guillemets dans le code de votre question (comme @kitschmaster a dit dans son commentaire) et que le code ressemble vraiment à ceci:

NSString *email = @"[email protected]"; 
// Case 1: 
NSLog(@"%@", [User findWithPredicate:@"email == '%@'", email]); 
// Case 2: 
NSLog(@"%@", [User findWithPredicate:[NSString stringWithFormat:@"email == '%@'", email]]); 

Dans le cas (1), votre méthode utilitaire crée le prédicat suivant

[NSPredicate predicateWithFormat:@"email == '%@'", email]; 

et cette recherche pour le prédicat verbat im chaîne"%@" en raison des guillemets. Si vous supprimez les guillemets:

NSLog(@"%@", [User findWithPredicate:@"email == %@", email]); 

puis cela fonctionne correctement.

Dans le cas (2), votre méthode utilitaire crée le prédicat

[NSPredicate predicateWithFormat:@"email == '[email protected]'"]; 

parce qu'elle est appelée avec une chaîne de requête déjà formatée. Cela fonctionne dans ce cas particulier. Mais il échouera si la requête elle-même contient des guillemets. Par exemple:

[User findWithPredicate:@"name == %@", @"a'b"] 

fonctionne correctement, mais

[User findWithPredicate:[NSString stringWithFormat:@"name == '%@'", @"a'b"]] 

accidents. L'utilisation de stringWithFormat devrait généralement être évitée lors de la création de prédicats.

Résumé: La première version fonctionne correctement si vous omettez les guillemets dans la chaîne de format. La deuxième version ne doit pas être utilisée.

+0

Merci, enlevez une citation de la chaîne de format pour résoudre le problème, je vais le garder à l'esprit. –

Questions connexes