Нет результата при поиске в NSArray NSDictionaries с использованием NSPredicate

Эй, у меня есть массив NSDictionaries (например, [tempArray addObject:[[[NSMutableDictionary alloc] initWithObjects:someArray forKeys:keys] autorelease]]; ), и когда я пытаюсь выполнить поиск по нему с помощью NSPredicate, он продолжает давать мне «Нет результатов». (TempArray становится self.patientList)

У меня нет предупреждений или ошибок во время компиляции, и если я NSLog([self.filteredArray count]);, он также возвращает 0.

Вот мой соответствующий код:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(first contains[cd] %@)", self.searchBar.text];
self.filteredArray = [self.patientList filteredArrayUsingPredicate:predicate];
return [self.filteredArray count];

self.patientList и self.filteredArray являются типами NSMutableArray и NSArray соответственно (изменение self.filteredArray на NSMutableArray не помогает).

Я также пытался использовать == вместо contains. Использование @"SELF contains[cd] %@" возвращает элемент только тогда, когда введен полный элемент (т.е. если ключ «имя» имеет значение @ «Боб», тогда, если я введу Боб, он отобразит его, но не когда я наберу Bo или ob).

Я действительно озадачен этим.

Заранее спасибо!


person Fred    schedule 22.11.2010    source источник


Ответы (3)


По-видимому, first является зарезервированным словом при использовании предикатов. Из документации Apple:

Зарезервированы следующие слова:

И, ИЛИ, В, НЕ, ВСЕ, ЛЮБЫЕ, НЕКОТОРЫЕ, НИ ОДИН, КАК, РЕГИСТР, CI, СОВПАДАЕТ, СОДЕРЖИТ, НАЧИНАЕТСЯ, ЗАКАНЧИВАЕТСЯ, МЕЖДУ, NULL, NIL, SELF, TRUE, YES, FALSE, NO, ПЕРВЫЙ , ПОСЛЕДНИЙ, РАЗМЕР, ЛЮБОЙ КЛЮЧ, ПОДЗАПРОС, ПРИВЕДЕНИЕ, ИСТИННЫЙ ПРЕДИКАТ, ЛОЖНЫЙ ПРЕДИКАТ

Просто измените свой ключ на что-то другое, например, firstName, и это сработает.

person Robert Höglund    schedule 22.11.2010
comment
Большое спасибо! Просто изменил это, и это сработало. И еще вопрос, а как вы сортируете массив словарей по одному ключу? Спасибо - person Fred; 22.11.2010
comment
Пожалуйста. Когда дело доходит до сортировки массива, доступно несколько методов, все они начинаются с sortedArray... . Если вам не удастся узнать, как это сделать, просто задайте новый вопрос здесь, в StackOverflow. - person Robert Höglund; 22.11.2010
comment
@Robert Но тогда как он узнает, по какому ключу сортировать? Хотя я посмотрю вокруг, спасибо. - person Fred; 23.11.2010
comment
Ах да, я помню, как обнаружил это несколько лет назад. - person Paul Shapiro; 02.07.2011

Вместо этого вы можете использовать «нравится»:

first like[c] *%@*
person Nevin    schedule 22.11.2010

На первый взгляд кажется правильным. Итак, есть ли в ваших словарях ключ с именем first? И если да, то точно ли это соответствует делу?

person Dave DeLong    schedule 22.11.2010
comment
Если я делаю NSLog(@"%@",[[self.patientList objectAtIndex:0] objectForKey:@"first"]); в том же месте (numberOfRowsInSection:), то это дает «Фредерик». Массив ключей выше: `NSArray *keys = [[[NSArray alloc] initWithObjects:@first,@last,@address,@number,nil] autorelease];` - person Fred; 22.11.2010