TeaCupApp
TeaCupApp

Reputation: 11452

NSPredicate - Unable to generate SQL for predicate, I wonder why?

I have already solved my problem [Blindly] without understanding root cause. But I would rather understand a concept from a professional. So could you please tell me why below identical code one works but another doesn't.

Code 1: Doesn't work

//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...

Code 2: Does work

//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...


Forgot to tell about what error I got, I got SIGABRT on below line, When I executed Code 1.

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

And one more thing, in GCC error was it cannot format predicate because of "gender == m".


Enlighten me!!

Thanks

Upvotes: 4

Views: 1684

Answers (2)

Beslan Tularov
Beslan Tularov

Reputation: 3131

example with swift

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)")
        }

Upvotes: 1

jrturton
jrturton

Reputation: 119242

See the predicate programming guide (heading "Literals"). You can use literals in your string but you have to enclose them in quotes, so

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

Would have worked. When predicateWithFormat adds in the argument, it knows it is a string. When you just have m in there, it doesn't know what to do with it, hence the error.

Upvotes: 10

Related Questions