NSPredicate - 无法为谓词生成SQL,我想知道为什么?

4
我已经[盲目地]解决了我的问题,但我更愿意从专业人士那里理解一个概念。所以,您能告诉我为什么下面两个相同的代码中一个可以工作而另一个不行吗?

代码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...


我忘了告诉你我遇到了什么错误,当我执行代码1时,我在下面这行代码处得到了SIGABRT错误。

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

还有一件事,在GCC错误中,它无法格式化谓词因为“gender == m”。


给我解释一下吧!

谢谢


1
你能否编辑一下标题,让它更加详细说明问题?这样可能会有更多的回答哦 :-) - kalaracey
1
@kalaracey,这个怎么样? - TeaCupApp
2个回答

10

请参阅谓词编程指南(标题为“字面量”)。您可以在字符串中使用字面量,但必须用引号括起来。

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

本来是可以用的。当predicateWithFormat添加了参数时,它知道这是一个字符串。但如果只有m在里面,它就不知道该怎么处理,因此出现了错误。


非常好!非常感谢。我在阅读文档时应该更加专注 :( 哈哈 - TeaCupApp

1
例子使用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)")
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接