6

Tôi có UISearhBarController trong ứng dụng của mình. Nó hiện đang tìm kiếm một cơ sở dữ liệu trực tuyến, nhưng thay vào đó tôi đang thay đổi nó để tìm kiếm một cơ sở dữ liệu lõi. hiện của nó sử dụng mã này:Sử dụng NSFetchedResultsController đến với 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; 
} 

Vì vậy, tôi có thiết lập cơ sở dữ liệu trong dữ liệu cốt lõi đã có, tôi chỉ cần treo lên các điều khiển tìm kiếm/NSFetchedResults với nó. Bất kỳ cách dễ dàng để làm như vậy?

Trả lời

6

Cách sạch nhất để làm điều đó là sử dụng hai NSFetchedResultsControllers và đặt biến vị ngữ trên "tìm kiếm" NSFRC của bạn thành searchText trong UISearchBar. Sau khi bạn quyết định sử dụng NSFRC nào, bạn chỉ cần đặt self.fetchedResultsController = "tìm kiếm" NSFRC hoặc NSFRC "mặc định".

Bạn cũng có thể sử dụng cùng một NSFRC và thay đổi biến vị ngữ, nhưng đó không phải là cách được khuyến nghị để thực hiện.

Xem nhận xét bên dưới. Nếu tất cả những gì đang thay đổi là vị từ, một FRC là tốt.

Đây là mẫu mã để thực hiện điều này:

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

này nên được ya bắt đầu.

+2

Tôi không đồng ý. Ở đâu nó nói thay đổi vị ngữ là "không phải là cách được đề nghị để làm điều đó"? Dễ dàng hơn và sạch hơn để cập nhật vị từ 'NSFetchRequest' và thực hiện tìm nạp mới. Có nhiều 'NSFetchedResultsControllers' không có ý nghĩa. – gschandler

+1

Bạn đúng, tôi đã nghĩ đến khi có hai tập dữ liệu riêng biệt liên quan, khi tập dữ liệu không thay đổi và chỉ có biến vị ngữ là, một FRC sẽ hoạt động tốt. –

+0

Giải pháp đơn giản và hiệu quả! – Giovanni

Các vấn đề liên quan