2011-02-14 47 views
10

在我的iOS應用程序中,我有一個非常簡單的謂詞,用於獲取控制器。用於多字搜索的NSPredicate

NSString *format = [NSString stringWithFormat:@"name like[c] '%@'", nameVar]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:format]; 
[fetchController setPredicate:predicate]; 

它執行基本的不區分大小寫的名稱查找。現在我想改變它,以便我可以在搜索框中輸入一些單詞(nameVar具有搜索框中的值),並用空格分隔,並使用謂詞過濾匹配所有這些關鍵字的結果。

所以,如果我有兩個名字: 「約翰史密斯」和「瑪麗史密斯」,我搜索:「史密斯M」我想只有一個結果,但像這樣的搜索:「Sm th ith」應該返回兩個值。

有沒有人有一個想法應該如何實施?

回答

31

編輯回一個普通的計算機上...

因此,有幾件事情需要注意的:

  1. 你並不需要把引號替換佔位符在格式字符串。當該方法構建謂詞時,它將創建一個抽象語法樹NSExpressionNSPredicate(具體爲NSComparisonPredicateNSCompoundPredicate)對象。您的字符串將被放置到類型NSConstantValueExpressionTypeNSExpression,這意味着它已經已被解釋爲常規字符串。事實上,將單引號放在格式字符串中會使謂詞不起作用。
  2. 您不僅限於謂詞中的單個比較。從它的聲音中,您想要搜索字符串中的「單詞」(nameVar)具有儘可能多的比較結果。在這種情況下,我們會將nameVar分解爲其組成單詞,併爲每個單詞創建一個比較。一旦我們完成了,我們AND他們一起創建一個單一的總體謂詞。下面的代碼確實如此。

原來的答案

您可以通過建立自己的NSCompoundPredicate做到這一點:

NSString *nameVar = ...; //ex: smith m 
NSArray *names = ...; //ex: John Smith, Mary Smith 

NSArray *terms = [nameVar componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
NSMutableArray *subpredicates = [NSMutableArray array]; 

for(NSString *term in terms) { 
    if([term length] == 0) { continue; } 
    NSPredicate *p = [NSPredicate predicateWithFormat:@"name contains[cd] %@", term]; 
    [subpredicates addObject:p]; 
} 

NSPredicate *filter = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates]; 
[fetchController setPredicate:filter]; 

警告:在我的iPhone瀏覽器中鍵入。

+0

因此,在我運行這段代碼之後,我可以在哪裏找到我的結果? subpredicates?我是iOS開發人員的初學者,如果問題很愚蠢,我很抱歉:) – 2015-10-18 14:46:52