1

я создал категорию NSManagedObject таких как создать, количества и еще. Все они работают поиск по следующемуNSPredicate создан с форматом и va_list/NSArray не удался, но струнной успехом

@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 

кроме И это результаты

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

В принципе, этот метод работает только тогда, когда я отправить строку вместо отформатированной строки и аргументов. Если я напечатаю предикат, созданный внутри этого метода, это результаты

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

У вас есть идеи, что может послужить причиной этого? Любые комментарии или предложения приветствуются:)

+1

это опечатка: @ "email =="% @ " должно быть: @" email == '% @' " – kitschmaster

+0

@kitschmaster Спасибо, это просто, удалите одну цитату, исправьте проблему. –

ответ

2

Я предполагаю, что вы забыли кавычки в коде вашего вопроса (как @kitschmaster сказал в своем комментарии), и что на самом деле код выглядит следующим образом:

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

В случае (1), ваш метод утилита создает следующий предикат

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

и этот предикат выполняет поиск verbatim строка"%@" из-за кавычек. Если вы удалите кавычки:

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

затем он работает правильно.

В случае (2), вашего метод утилиты создает предикат

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

, потому что она вызывается с уже отформатированной строкой запроса. Это работает в этом конкретном случае. Но он не сработает, если сам запрос содержит кавычки. Например:

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

работает правильно, но

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

аварии. Следует избегать использования stringWithFormat при создании предикатов.

Резюме: Первая версия работает правильно, если опустить кавычки в строке формата. Вторая версия не должна использоваться.

+0

Спасибо, удалите одну цитату из строки формата, исправьте проблему. Я буду помнить об этом.:) –