繁体   English   中英

带有NSPredicate的核心数据多对多关系filterContentForSearchText

[英]Core Data to-many relationship filterContentForSearchText with NSPredicate

我有一个xcdatamodeld看起来像这样: 在此处输入图片说明

我有一个像这样的Scope到我的UITableView UISearchBar

在此处输入图片说明

我添加了以下方法:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope{

    [searchResults removeAllObjects];

    if ([scope isEqualToString:@"Name"]){
        NSString *matchString =  [NSString stringWithFormat: @".*\\b%@.*",searchText];
        NSString *predicateString = @"SELF.name MATCHES[cd] %@";
        NSPredicate *predicate =[NSPredicate predicateWithFormat: predicateString, matchString];
        searchResults = [NSMutableArray arrayWithArray:[[self.fetchedResultsController fetchedObjects] filteredArrayUsingPredicate:predicate]];
    }

    if ([scope isEqualToString:@"Ingredient"]){
        NSString *matchString =  [NSString stringWithFormat: @".*\\b%@.*",searchText];
        NSString *predicateString = @"ANY SELF.ingredients.name MATCHES[cd] %@";
        NSPredicate *predicate =[NSPredicate predicateWithFormat: predicateString, matchString];
        searchResults = [NSMutableArray arrayWithArray:[[self.fetchedResultsController fetchedObjects] filteredArrayUsingPredicate:predicate]];
    }

}


- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
    [self filterContentForSearchText:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
    return YES;
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption{
    [self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
    return YES;
}

- (void)viewDidLoad {
    searchResults = [NSMutableArray arrayWithCapacity:[[fetchedResultsController fetchedObjects] count]];
}

我想要的是:

(1)当我搜索范围为“名称”的单词时,应用程序会显示所有包含该单词的配方

在此处输入图片说明

(2)当我搜索范围为“ Ingredient”的单词时,该应用程序将显示所有包含其名称包含该单词的成分的食谱

在此处输入图片说明

上面的图片显示了两个配方,名称分别为“ aglio olio pepe”和“ rigatoni sale pepe”,以及成分(aglio,olio,pepe)和(rigatoni,sale,pepe)。

第二次搜索应同时显示两者。

实际有效的方法:(1)

实际不起作用的是:(2)

为什么?

更改xcdatamodeled解决了问题

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM