Попытка сделать предикат связи. Не работает. - PullRequest
1 голос
/ 17 июня 2011

Я пытаюсь составить предикат для поиска по основным данным. Поэтому, когда пользователь вводит текст в строку поиска, он отображает результаты для всего, что имеет этот текст в атрибутах name, optionOne или optionTwo.

Я пробовал это:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {

    if (self.sBar.text !=nil)   {

        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(name contains[cd] %@) || (optionOne contains[cd] %@) || (optionTwo contains[cd] %@)", self.sBar.text];

        [fetchedResultsController.fetchRequest setPredicate:predicate];

    }

    NSError *error = nil;
    if (![[self fetchedResultsController] performFetch:&error]) {
        // Handle error
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }           

    [self.myTable reloadData];

    [sBar resignFirstResponder];  

}

Но это просто сбой без наглядной причины. Поэтому я думаю, что мне нужно взять эти три предиката и как-то объединить их:

NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", self.sBar.text];

NSPredicate *optionOnePredicate = [NSPredicate predicateWithFormat:@"optionOne contains[cd] %@", self.sBar.text];

NSPredicate *optionTwoPredicate = [NSPredicate predicateWithFormat:@"optionTwo contains[cd] %@", self.sBar.text];

1 Ответ

5 голосов
/ 17 июня 2011
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(name contains[cd] %@) || (optionOne contains[cd] %@) || (optionTwo contains[cd] %@)", self.sBar.text];

Поскольку в вашей строке 3 %@ токена, в конце необходимо иметь 3 self.sBar.text выражений.

В качестве альтернативы, вы можете сделать что-то вроде этого:

NSPredicate *template = [NSPredicate predicateWithFormat:@"name contains[cd] $SEARCH OR optionOne contains[cd] $SEARCH OR optionTwo contains[cd] $SEARCH"];
NSDictionary *replace = [NSDictionary dictionaryWithObject:self.sBar.text forKey:@"SEARCH"];
NSPredicate *predicate = [template predicateWithSubstitutionVariables:replace];

Это удобнее, если вы много строите этот предикат, потому что вы можете хранить предикат "шаблона" в ivar.Разбор предиката - не самая хитрая вещь, и использование версии шаблона означает, что вам придется анализировать его только один раз (вместо каждого изменения текста в строке поиска).

...