2014-04-21 64 views
0

我有一個具有以下屬性的NSManagedObject被逆轉:NSPredicate與格式有當兩個格式字符串使用

  • 狀態
  • 優先

現在我想能夠分別使用這些屬性過濾我的實體。所以,我希望,我必須有這些方針謂詞:

status CONTAINS[c] ‘open’ 

我變得很怪異的結果,只要我有我的斷言兩個變量,我必須反向kind順序和value在我的情況,讓我得到想要的結果:

NSString *kind = @"status"; // DEBUGGING 
NSString *value = @"open"; // DEBUGGING 

// This works although it defies all logic 
NSString *predicate = [NSString stringWithFormat:@"('%@' CONTAINS[c] %@)", value, kind]; 
self.myFilterPredicate = [NSPredicate predicateWithFormat:predicate]; 

然而,這不適用於某些原因:

NSString *predicate = [NSString stringWithFormat:@"(%@ CONTAINS[c] ‘%@‘)」, kind, value]; 
+0

我無法重現您的問題。第一個謂詞字符串導致崩潰。第二個謂詞不會編譯,因爲它包含印刷引號而不是簡單的引號。修復之後,第二個謂詞字符串起作用並給出預期的結果。 - 但是,正確的方法是使用'self.myFilterPredicate = [NSPredicate predicateWithFormat:@「%K ==%@」,kind,value];'。 –

+0

@MartinR對於那些角色很抱歉。你能告訴我在這個例子中'%K'做了什麼嗎? – Besi

回答

1

我無法重現確切的問題,但通常不應使用stringWithFormat來創建謂詞。只要替換鍵或值包含空格或引號之類的任何特殊字符,它就會引發問題。

更好的方法是

self.myFilterPredicate = [NSPredicate predicateWithFormat:@"%K == %@", kind, value]; 

%K是一個佔位符由關鍵路徑代替,如「狀態」。