NSPredicate - Невозможно сгенерировать SQL для предиката, интересно, почему? - PullRequest
4 голосов
/ 05 октября 2011

Я уже решил свою проблему [слепо], не понимая причину. Но я бы лучше понял концепцию от профессионала. Не могли бы вы сказать мне, почему ниже идентичный код один работает, а другой нет.

Код 1: не работает

//Above code omitted...

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"gender == m"]; //NOTICE HERE
[request setPredicate:predicate];   
NSError *error = nil;
self.people = [self.managedObjectContext executeFetchRequest:request error:&error];

 //Below code omitted...

Код 2: Работает ли

//Above code omitted...

NSString *type = @"m";    
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"gender == %@",type]; //NOTICE HERE
[request setPredicate:predicate];   
NSError *error = nil;
self.people = [self.managedObjectContext executeFetchRequest:request error:&error];

//Below code omitted...

<ч /> Забыл рассказать о том, какую ошибку я получил, я получил SIGABRT в строке ниже, когда я выполнил Код 1.

 self.people = [self.managedObjectContext executeFetchRequest:request error:&error];

И еще одна вещь, в GCC ошибка состояла в том, что он не может отформатировать предикат из-за "пола == м".

<ч /> Просвети меня !!

Спасибо

Ответы [ 2 ]

10 голосов
/ 05 октября 2011

См. Руководство по программированию предиката (заголовок "Литералы").Вы можете использовать литералы в вашей строке, но вы должны заключать их в кавычки, поэтому

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"gender == 'm'"];

сработало бы.Когда предикатWithFormat добавляет аргумент, он знает, что это строка.Когда у вас просто есть m , он не знает, что с ним делать, поэтому возникает ошибка.

1 голос
/ 15 мая 2015

пример с быстрым

let appDelegate =
        UIApplication.sharedApplication().delegate as! AppDelegate
        let managedContext = appDelegate.managedObjectContext!
        let fetchRequest = NSFetchRequest(entityName:"Words")
        fetchRequest.predicate = NSPredicate(format: "letter == '\(letter)'")
        var error: NSError?
        let fetchedResults =
        managedContext.executeFetchRequest(fetchRequest,
            error: &error) as? [NSManagedObject]
        if let results = fetchedResults {
                       println(results)
        } else {
            println("Could not fetch \(error), \(error!.userInfo)")
        }
...