6

私は自分のアプリケーションにUISearhBarControllerを持っています。現在、オンラインデータベースを検索していますが、代わりにコアデータデータベースを検索するように変更しています。 ITSは現在、このコードを使用:NSFetchedResultsControllerをUISearchBarで使用する

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

だから私はすでにコアデータにデータベースを設定している、私はそれに検索/ NSFetchedResultsコントローラをフックアップする必要があります。そうする簡単な方法は?

答えて

6

これを行う最もクリーンな方法は、2つのNSFetchedResultsControllerを使用して、 "検索" NSFRCの述語をUISearchBarのsearchTextに設定することです。使用するNSFRCを決定した後は、self.fetchedResultsController = "NSFRC"または "default" NSFRCを検索します。

また、同じNSFRCを使用して述語を変更することもできますが、推奨する方法ではありません。

以下のコメントを参照してください。述語がすべて変化している場合、1つの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]; 
} 

これはyaが始める必要があります。

+2

私は同意しません。述語を変更することは、「それを行うための推奨された方法ではありません」と言うのはどこですか? 'NSFetchRequest'述部を更新し、新しいフェッチを実行することがより簡単できれいです。複数の 'NSFetchedResultsControllers'を持つことは理にかなっていません。 – gschandler

+1

データセットが変更されておらず、述語だけがある場合、1つのFRCがうまく動作するという、2つの異なるデータセットが関係していると思います。 –

+0

シンプルで効率的なソリューション! – Giovanni

関連する問題