2011-07-15 46 views
18

我想爲iPhone開發一個應用程序使用核心數據,我用一個非常基本的謂詞來抓取對象。 (即attribute_name ==字符串)無法爲謂詞生成SQL(_STRING PREDICATE_)(RHS上的問題)是什麼意思?

我檢查了模型,以確保屬性名稱是正確的,我知道從this SO question RHS的意思是「右手邊」,這導致我「串」部分。我創建使用

NSString *predicateString = [NSString stringWithFormat:@"attribute_name==%@", string]; 

然後獲取格式字符串,我使用的是這樣的:

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:_entityName inManagedObjectContext:managedObjectContext]; 
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:entityDescription]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString]; 
[request setPredicate:predicate]; 
NSError *error = nil; 
NSArray *array = [managedObjectContext executeFetchRequest:request error:&error]; 

我缺少什麼?什麼可能導致這個錯誤發生?

謝謝。

+0

你的字符串包含什麼? – bbum

+0

該字符串包含使用快速枚舉擴展的數組中的另一個字符串對象。因此它看起來像這樣:for(NSString * stringInArray in array){NSString * predicateString = [NSString stringWithFormat:@「attribute_name ==%@」,stringInArray]; }'感謝@ bbum的快速響應! –

回答

42

您需要引用字符串,如果你真的想使用NSString stringWithFormat:消息,或者您可以使用NSPredicate predicateWithFormat:消息格式和參數,因爲它會「做正確的事」,在您的情況RHS(我建議你使用NSPredicate方法不帶引號)

NSString *predicateString = [NSString stringWithFormat:@"attribute_name==\"%@\"", string]; 
+0

這工作!非常感謝@BrentPriddy!我不是100%爲什麼這個工作,雖然看到我認爲報價是在使用替換時自動添加的:'必須在表達式中引用字符串常量 - 單引號和雙引號都可以接受,但必須適當配對(即,雙引號(「)與單引號(')不匹配)。如果使用%@使用變量替換(例如firstName,如%@),則會自動爲您添加引號。雖然! –

+2

只有在使用NSPredicate的predicateWithFormat方法時纔會自動添加它們。您正在使用NSString的stringWithFormat方法,它不是使用公式謂詞的正確方法 –

19

你這樣做是錯誤的。你不應該創建一個格式字符串。

我猜(根據你的反應@布倫特的答案),你正在做這樣的事情:

NSString *predicateString = [NSString stringWithFormat:@"foo == \"%@\"", bar]; 
NSPredicate *p = [NSPredicate predicateWithFormat:predicateString]; 

不要做

而是執行此操作:如果bar恰好包含一個"字符

NSPredicate *p = [NSPredicate predicateWithFormat:@"foo == %@", bar]; 

第一個將失敗。第二個不會。

+0

我可以看到爲什麼「字符會打破第一個示例,但我不完全明白爲什麼第一個適合我,第二個不適合我。要清楚,爲什麼第一個只在使用轉義引號時才起作用? –