NSPredicate: объединить содержит с IN

У меня есть набор пользователей в CoreData и поле поиска в моем приложении. Пользователь имеет свойства имя и имя.

В настоящее время у меня есть предикат какuser.name СОДЕРЖИТ [c]% @ ИЛИ user.firstname СОДЕРЖИТ [c]% @ "

Это работает, пока пользователь не введет полное имя, например "Джон Смит", Даже если он печатаетДжон См " Объект Джона Смита должен быть найден.

Какой предикат объединяет массив (IN) поисковых терминов с CONTAINS?

Ответы на вопрос(4)

Решение Вопроса

5 года я могу ответить на мой вопрос с более сложным примером в swift:

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)
 Perjan Duro08 июн. 2015 г., 13:59
Удивительный человек. Большое спасибо!
 Eddie19 окт. 2016 г., 05:19
Это, вероятно, так же, как @Martin R 'Ответ, просто разница в языке. Вы должны принять его IMO.

 с "СОДЕРЖИТ" в предикате. Но вы можете разбить строку поиска на слова и создатьсоставной предикат ":

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")

который будет соответствоватьДжон Смит", но нет "Джон Миллер ".

 Rick van der Linde11 нояб. 2015 г., 09:50
5 лет в iOS, и я впервые это вижу. Это все еще должен быть принятый ответ IMO.

В моем классе NSManagedObject (пользователь) я добавил следующий метод, объединив два значения в одну строку:

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

Затем вы'Вам понадобятся только следующие строки для сопоставления с вашим списком, который в моем случае является NSArray с объектами пользователя:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchString];
NSArray *filteredUsers = [users filteredArrayUsingPredicate:predicate];
 netshark100029 нояб. 2012 г., 09:31
это нерешить проблему, когда пользователь ищет "фамилия Имя"

Swift 4 Обновление:

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

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

ИспользоватьorCompoundPredicate при получении данных.

Ваш ответ на вопрос