NSString * predicateFormat如何搜索两个实体

时间:2010-06-10 20:23:15

标签: cocoa predicate uisearchdisplaycontroller

你好,并抱歉这个愚蠢的问题,但我想我可能会在这里错过一些简单的东西,而且我自己也无法弄明白。

我尝试使用以下代码搜索表格视图:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{

    NSString *predicateFormat = @"(name contains[c] %@) OR (age contains[c] %@)";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFormat, searchString];
    self.fetchedResultsController = [self resetFetchedResultsController:predicate cached:NO];

    NSError *error = nil;
    [self.fetchedResultsController performFetch:&error];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

我想要实现的是当用户搜索表格时,不仅可以搜索“名称”,还可以搜索“年龄”!

我上面的代码只搜索“名称”

我错过了一些简单的事情吗?

谢谢你的时间

1 个答案:

答案 0 :(得分:3)

而不是:

NSString *predicateFormat = @"(name contains[c] %@) OR (age contains[c] %@)";
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFormat, searchString];

您有三种选择:

NSString *predicateFormat = @"(name contains[c] %@) OR (age contains[c] %@)";
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFormat, searchString, searchString];

或者:

NSString *predicateFormat = @"(name contains[c] %1$@) OR (age contains[c] %1$@)";
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFormat, searchString];

或者:

NSString *predicateFormat = @"(name contains[c] $SEARCH) OR (age contains[c] $SEARCH)";
NSPredicate *template = [NSPredicate predicateWithFormat:predicateFormat];
NSPredicate *predicate = [template predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObject:searchString forKey:@"SEARCH"]];

如果您正在构建具有未知数量的替换的大型谓词,则第3个选项很好。第二个可能是最简单的,不重复自己,但第一个是最容易理解的。