6

Tengo un UISearhBarController en mi aplicación. Actualmente busca una base de datos en línea, pero la cambio para buscar en una base de datos central. Su momento de utilizar este código:Usando NSFetchedResultsController para con 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; 
} 

Así que tienen la configuración de base de datos en los datos básicos ya, sólo hay que conectar el controlador de búsqueda/NSFetchedResults a ella. ¿Alguna forma fácil de hacerlo?

Respuesta

6

La forma más limpia de hacerlo es usar dos NSFetchedResultsControllers y establecer el predicado en su "búsqueda" NSFRC para ser el texto de búsqueda en el UISearchBar. Después de decidir qué NSFRC usar, simplemente configure su NSFRC self.fetchedResultsController = "NSFRC" o NSFRC "predeterminado".

También puede usar el mismo NSFRC y cambiar el predicado, pero esa no es la manera recomendada de hacerlo.

Vea el comentario a continuación. Si todo lo que está cambiando es el predicado, un FRC está bien.

Aquí es código de ejemplo para hacer esto:

// 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]; 
} 

Esto debe conseguir ya comenzado.

+2

No estoy de acuerdo. ¿Dónde dice que cambiar el predicado es "no la forma recomendada de hacerlo"? Más fácil y limpio para actualizar el predicado 'NSFetchRequest' y realizar una nueva búsqueda. Tener múltiples 'NSFetchedResultsControllers' no tiene sentido. – gschandler

+1

Tiene razón, estaba pensando cuando hay dos conjuntos de datos distintos involucrados, cuando el conjunto de datos no está cambiando y solo el predicado es, un FRC funcionará bien. –

+0

¡Solución simple y eficiente! – Giovanni

Cuestiones relacionadas