使用NSFetchedResultsController与UISearchBar一起使用

6

我在我的应用中有一个UISearchBar控制器。它目前搜索的是在线数据库,但我要改为搜索Core Data数据库。它目前使用这段代码:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{
    if (self.billingSearchBar == searchBar) {
        [self.billingSearchController filterResultsUsingString:searchText];
    }
}

- (void)filterResultsUsingString:(NSString *)filterString 
{
    self.billingSearchText = filterString;
    NSArray *billing_codes = [self billingSearch:self.billingSearchText searchType:self.billingSearchCategory];
    self.displayedBillingSearch = billing_codes;
    self.billingSearch = billing_codes; 
    [self.tableView reloadData];
}

-(NSMutableArray*)billingSearch:(NSString*)searchString searchType:(NSString*)searchType
{
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/server/20111115/60b88126/billing_search/", [self getHost]]];

    ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease];
    [request setPostValue:searchString forKey:@"query"];
    [request setPostValue:searchType forKey:@"category"];

    [request startSynchronous];
    NSError *error = [request error];
    NSString *responseString;
    if (!error) {
        responseString = [request responseString];
    }

    NSMutableArray *search_results = [[NSMutableArray alloc] init];
    NSDictionary *responseDictionary = [responseString JSONValue];

    for (id key in [responseDictionary valueForKey:@"search_results"]) {
        [search_results addObject:key];
    }
    return search_results;  
}

我已经在Core Data中设置好了数据库,现在只需要将搜索/NSFetchedResults控制器与之连接起来。有什么简单的方法可以做到吗?

1个回答

6

最干净的方法是使用两个NSFetchedResultsController,并在“搜索”NSFRC上设置UISearchBar中的searchText谓词。 在决定使用哪个NSFRC之后,只需将self.fetchedResultsController设置为“搜索”NSFRC或“默认”NSFRC。

您也可以使用相同的NSFRC并更改谓词,但这不是推荐的方法。

见下方注释。如果只是谓词发生变化,则一个FRC就足够了。

以下是完成此操作的示例代码:

// First use the Searchbar delegate methods
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{   
    [self filterContentForSearchText:searchText];
}

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    [self filterContentForSearchText:searchBar.text];
    [searchBar resignFirstResponder];
}

// The method to change the predicate of the FRC
- (void)filterContentForSearchText:(NSString*)searchText
{
    NSString *query = searchText;
    if (query && query.length) {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@ or department contains[cd] %@", query, query];
        [self.fetchedResultsController.fetchRequest setPredicate:predicate];
        [self.fetchedResultsController.fetchRequest setFetchLimit:100]; // Optional, but with large datasets - this helps speed lots
    }

    NSError *error = nil;
    if (![[self fetchedResultsController] performFetch:&error]) {
        // Handle error
        exit(-1);
    }

    [self.myTableView reloadData];
}

这会让你开始。

2
жҲ‘дёҚеҗҢж„ҸгҖӮеңЁе“ӘйҮҢиҜҙж”№еҸҳи°“иҜҚжҳҜвҖңдёҚжҺЁиҚҗзҡ„ж–№ејҸвҖқпјҹжӣҙж–°NSFetchRequestи°“иҜҚ并жү§иЎҢж–°зҡ„иҺ·еҸ–жӣҙе®№жҳ“гҖҒжӣҙз®ҖжҙҒгҖӮжӢҘжңүеӨҡдёӘNSFetchedResultsControllerжІЎжңүж„Ҹд№үгҖӮ - gschandler
1
你说得对,我当时考虑的是有两个不同的数据集涉及到的情况。如果数据集没有改变,只有谓词改变,一个FRC就足够了。 - LJ Wilson
简单而高效的解决方案! - Giovanni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接