2011-10-05 31 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)") 
     } 
相關問題