2012-11-20 23 views
8

我在CoreData中有一組用戶,在我的應用程序中有一個搜索字段。用戶具有屬性名和名稱。NSPredicate:將CONTAINS與IN結合使用

目前我有一個像謂語「user.name包含:[C]%@或user.firstname包含:[C]%@」

這工作,直到用戶鍵入一個全名,如「約翰·史密斯」。即使他輸入「john sm」,也應該找到John Smith-Object。

將搜索項的數組(IN)與CONTAINS組合起來的謂詞是什麼?

回答

13

2.5年後,我可以回答我的問題與雙在迅速噸更復雜的例子:

var predicateList = [NSPredicate]() 

let words = filterText.componentsSeparatedByString(" ") 

for word in words{ 

    if count(word)==0{ 
      continue 
    } 

    let firstNamePredicate = NSPredicate(format: "firstName contains[c] %@", word) 
    let lastNamePredicate = NSPredicate(format: "lastName contains[c] %@", word) 
    let departmentPredicate = NSPredicate(format: "department contains[c] %@", word) 
    let jobTitlePredicate = NSPredicate(format: "jobTitle contains[c] %@", word) 

    let orCompoundPredicate = NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType, subpredicates: [firstNamePredicate, lastNamePredicate,departmentPredicate,jobTitlePredicate]) 

    predicateList.append(orCompoundPredicate) 
} 

request.predicate = NSCompoundPredicate(type: NSCompoundPredicateType.AndPredicateType, subpredicates: predicateList) 
+0

令人驚歎的男人。非常感謝! –

+6

這可能與@Martin R的答案一樣,只是語言不同。你應該接受他。 – Eddie

35

我不認爲你可以在謂詞中將「IN」和「CONTAINS」結合起來。但是你可以拆分搜索字符串的話,並創建一個「複合謂語」:

NSString *searchString = @"John Sm "; 
NSArray *words = [searchString componentsSeparatedByString:@" "]; 
NSMutableArray *predicateList = [NSMutableArray array]; 
for (NSString *word in words) { 
    if ([word length] > 0) { 
     NSPredicate *pred = [NSPredicate predicateWithFormat:@"user.name CONTAINS[c] %@ OR user.firstname CONTAINS[c] %@", word, word]; 
     [predicateList addObject:pred]; 
    } 
} 
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicateList]; 
NSLog(@"%@", predicate); 

該示例產生謂詞

(user.name CONTAINS[c] "John" OR user.firstname CONTAINS[c] "John") AND 
(user.name CONTAINS[c] "Sm" OR user.firstname CONTAINS[c] "Sm") 

這將匹配「約翰·史密斯」,而不是「約翰·米勒」。

+2

進入iOS 5年,這是我第一次看到這個。這應該仍然是公認的答案。 –

0

我有同樣的問題,解決它像這樣:

在我的NSManagedObject類(用戶),我增加了下面的方法,這兩個值合併成一個單一的字符串:

- (NSString *)name 
{ 
    return [NSString stringWithFormat:@"%@ %@", self.firstname, self.lastname]; 
} 

然後你「會只需要以下行來匹配您的清單,這是在我的情況下,一個NSArray與用戶對象:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchString]; 
NSArray *filteredUsers = [users filteredArrayUsingPredicate:predicate]; 
+0

當用戶搜索「姓氏名」時,這並不能解決問題 – netshark1000

0

夫特4更新:

let firstName = NSPredicate(format: "firstName CONTAINS[c] %@", searchText) 
let lastName = NSPredicate(format: "lastName CONTAINS[c] %@", searchText) 

let orCompoundPredicate = NSCompoundPredicate(orPredicateWithSubpredicates: 
[firstNamePredicate,lastNamePredicate] 

使用orCompoundPredicate擷取數據。