试图制作复合谓词。不工作。

时间:2011-06-17 18:00:12

标签: ios core-data uisearchbar nspredicate

我正在尝试为我的核心数据搜索创建复合谓词。因此,当用户在搜索栏中输入文本时,它将显示名称,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 个答案:

答案 0 :(得分:5)

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中。解析谓词不是最快的事情,使用模板版本意味着你只需要解析一次(而不是每次搜索栏的文本都改变)。