【问题标题】:Using NSFetchedResultsController to with UISearchBar使用 NSFetchedResultsController 与 UISearchBar
【发布时间】:2011-12-16 20:33:37
【问题描述】:

我的应用中有一个 UISearhBarController。它目前搜索在线数据库,但我将其更改为搜索核心数据数据库。它目前使用此代码:

- (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;  
}

所以我已经在核心数据中设置了数据库,我只需要将 search/NSFetchedResults 控制器连接到它。有什么简单的方法吗?

【问题讨论】:

    标签: iphone objective-c cocoa-touch core-data nsfetchedresultscontroller


    【解决方案1】:

    最简洁的方法是使用两个 NSFetchedResultsController 并将“搜索”NSFRC 上的谓词设置为 UISearchBar 中的 searchText。在您决定使用哪个 NSFRC 后,您只需设置 self.fetchedResultsController = "searching" NSFRC 或 "default" 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];
    }
    

    这应该让你开始。

    【讨论】:

    • 我不同意。它在哪里说更改谓词是“不推荐的方法”?更新NSFetchRequest 谓词并执行新的提取更容易、更干净。拥有多个NSFetchedResultsControllers 没有意义。
    • 你是对的,我在想当涉及两个不同的数据集时,当数据集没有改变并且只有谓词是时,一个 FRC 可以正常工作。
    • 简单高效的解决方案!
    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多