2011-10-05 43 views
4

我已经解决了我的问题[盲目]不了解根本原因。但我更愿意从专业人士那里了解一个概念。那么你能否告诉我为什么在相同的代码下工作,但另一个不工作。NSPredicate - 无法为谓词生成SQL,我想知道为什么?

代码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错误是因为“性别== m”它不能格式化谓词。


给我启发!

感谢

+1

你能编辑您的标题更解释了一下?这可能有助于获得更多答案:-) – kalaracey

+1

@kalaracey,这个怎么样? – doNotCheckMyBlog

回答

10

predicate programming guide(标题 “面值”)。你可以在你的字符串中使用文字,但你必须用引号将它们括起来,所以

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

会工作。当predicateWithFormat添加参数时,它知道它是一个字符串。当你只有m时,它不知道该如何处理它,因此出现错误。

+0

非常好!非常感谢。我应该更专注于阅读文档:(大声笑 – doNotCheckMyBlog

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)") 
     } 
相关问题