2012-06-08 2 views
5

Я искал этот ответ по всему Интернету, но пока не повезло. Поэтому мне нужно проконсультироваться с умными и милыми людьми здесь. Это мой первый вопрос, задающий здесь вопрос, поэтому я надеюсь, что я делаю это правильно и не повторяю вопрос.Обратный вид строки сравнения с использованием NSPredicate

Для всех примеров, которые я видел, это строка поиска, которая является подстрокой того, что хранится в Core Data. С другой стороны, я хочу достичь следующего:

Строки, хранящиеся в основных данных, фактически являются подстроками. Я хочу выполнить поиск, получив все основные строки данных, которые имеют подстроки, принадлежащие предоставленной строке поиска.

Для бывших: В основных данных, у меня есть «AB», «BC», «ABC», «ABCDEF», «GH», «АВА» А в приложении я делаю поиск, предоставляя супер -string: «ABCDEF», результат вернет «AB», «BC», «ABC», «ABCDEF», но не «GH», «ABA», потому что эти две подстроки не принадлежат к суперстроке ,

Как мне настроить инструкцию predicateWithFormat?

Это обыкновение»работа Потому что он делает наоборот:

NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"substring LIKE[c] %@", @"ABCDEF"]; 

Спасибо всем!

ответ

4

Реверс CONTAINS не будет работать. Кроме того, вы не сможете использовать LIKE, потому что вам придется взять атрибут, который вы ищете, и преобразовать его в подстановочную строку.

Путь к использованию заключается в использовании MATCHES, поскольку вы можете использовать регулярные выражения. Во-первых, преобразуйте строку поиска в регулярное выражение, добавив * после каждого письма. Затем сформируем предикат.

Данное решение было протестировано для работы с вашим примером.

NSString *string= @"ABCDEF"; 
NSMutableString *new = [NSMutableString string]; 
for (int i=0; i<string.length; i++) { 
    [new appendFormat:@"%c*", [string characterAtIndex:i]]; 
} 
// new is now @"A*B*C*D*E*F*"; 
fetchRequest.predicate = [NSPredicate predicateWithFormat: 
          @"stringAttribute matches %@", new]; 

где stringAttribute в предикате это имя вашего NSString атрибут вашего управляемого объекта.

+0

Ничего себе это заранее. Спасибо, это работает! Теперь я должен попытаться понять, как это работает здесь. Еще раз спасибо! – BevPeter

+0

@ Мунди, я не уверен, что вы подразумеваете под «обратными СОДЕРЖАНИЯМИ», это не сработает. Предикат, который я предоставил в своем ответе, работает, я обновил свой ответ, чтобы показать код для использования этого предиката с основными данными. – rdelmar

+0

Я попробовал вашу версию, не получив правильные подстроки. Очевидно, это было до вашего редактирования. После вашего редактирования я мог бы отредактировать мой ответ и т. Д. * Ad infinitum *. Спасибо за вашу коррекцию. – Mundi

0

Я думаю, что это будет работать:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"%@ contains self",@"ABCDEF"]; 

Вы бы использовать его как это в основных данных:

-(IBAction)doFetch:(id)sender { 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    request.entity = [NSEntityDescription entityForName:@"Expense" inManagedObjectContext:self.managedObjectContext]; 
    request.predicate = [NSPredicate predicateWithFormat:@"%@ contains desc",@"ABCDEF"]; 
    NSArray *answer = [self.managedObjectContext executeFetchRequest:request error:nil]; 
    NSLog(@"%@",answer); 
} 

В этом примере, «убывание» является атрибутом сущности «Расход» , Это правильно извлекает только строки, где «desc» - подстрока «ABCDEF».

+0

'SELF' лучше, я думаю;) – Kjuly

+2

@ Kjuly, неважно, будет ли его верхний или нижний регистр. – rdelmar

+0

yep, но я бы хотел использовать верхний регистр для зарезервированных слов. ;) – Kjuly

Смежные вопросы