Использование NSFetchedResultsController для с UISearchBar - PullRequest
6 голосов
/ 17 декабря 2011

В моем приложении есть 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. Есть ли простой способ сделать это?

1 Ответ

6 голосов
/ 17 декабря 2011

Самый чистый способ сделать это - использовать два NSFetchedResultsControllers и установить предикат для вашего «поискового» NSFRC в качестве searchText в UISearchBar. После того, как вы решите, какой NSFRC использовать, вы просто устанавливаете свой self.fetchedResultsController = "search" 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];
}

Это должно начать тебя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...