我在CoreData中有一組用戶,在我的應用程序中有一個搜索字段。用戶具有屬性名和名稱。NSPredicate:將CONTAINS與IN結合使用
目前我有一個像謂語「user.name包含:[C]%@或user.firstname包含:[C]%@」
這工作,直到用戶鍵入一個全名,如「約翰·史密斯」。即使他輸入「john sm」,也應該找到John Smith-Object。
將搜索項的數組(IN)與CONTAINS組合起來的謂詞是什麼?
我在CoreData中有一組用戶,在我的應用程序中有一個搜索字段。用戶具有屬性名和名稱。NSPredicate:將CONTAINS與IN結合使用
目前我有一個像謂語「user.name包含:[C]%@或user.firstname包含:[C]%@」
這工作,直到用戶鍵入一個全名,如「約翰·史密斯」。即使他輸入「john sm」,也應該找到John Smith-Object。
將搜索項的數組(IN)與CONTAINS組合起來的謂詞是什麼?
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)
我不認爲你可以在謂詞中將「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")
這將匹配「約翰·史密斯」,而不是「約翰·米勒」。
進入iOS 5年,這是我第一次看到這個。這應該仍然是公認的答案。 –
我有同樣的問題,解決它像這樣:
在我的NSManagedObject類(用戶),我增加了下面的方法,這兩個值合併成一個單一的字符串:
- (NSString *)name
{
return [NSString stringWithFormat:@"%@ %@", self.firstname, self.lastname];
}
然後你「會只需要以下行來匹配您的清單,這是在我的情況下,一個NSArray與用戶對象:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchString];
NSArray *filteredUsers = [users filteredArrayUsingPredicate:predicate];
當用戶搜索「姓氏名」時,這並不能解決問題 – netshark1000
夫特4更新:
let firstName = NSPredicate(format: "firstName CONTAINS[c] %@", searchText)
let lastName = NSPredicate(format: "lastName CONTAINS[c] %@", searchText)
let orCompoundPredicate = NSCompoundPredicate(orPredicateWithSubpredicates:
[firstNamePredicate,lastNamePredicate]
使用orCompoundPredicate擷取數據。
令人驚歎的男人。非常感謝! –
這可能與@Martin R的答案一樣,只是語言不同。你應該接受他。 – Eddie