6

के साथ NSFetchedResultsController का उपयोग करना मेरे पास मेरे ऐप में UISearhBarController है। यह वर्तमान में एक ऑनलाइन डेटाबेस खोजता है, लेकिन मैं इसके बजाय कोर डेटा डेटाबेस खोजने के लिए इसे बदल रहा हूं। इसकी वर्तमान में इस कोड का उपयोग: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

ऐसा करने का सबसे साफ तरीका दो NSFetchedResultsControllers का उपयोग करना है और UISearchBar में SearchText होने के लिए अपने "खोज" एनएसएफआरसी पर भविष्यवाणी सेट करें। आपके द्वारा उपयोग किए जाने वाले एनएसएफआरसी का निर्णय लेने के बाद, आप बस अपना स्वयं का सेट करें। फ़ेच किए गए रीसेट कंट्रोलर = "खोज" एनएसएफआरसी या "डिफ़ॉल्ट" एनएसएफआरसी।

आप एक ही एनएसएफआरसी का उपयोग कर सकते हैं और भविष्यवाणी बदल सकते हैं, लेकिन ऐसा करने का यह अनुशंसित तरीका नहीं है।

नीचे टिप्पणी देखें। यदि जो भी बदल रहा है वह अनुमान है, एक एफआरसी ठीक है।

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

यह हो फिर शुरू कर दिया जाना चाहिए:

यहाँ इस किया जाना नमूना कोड है।

+2

मैं असहमत हूं। कहां कहता है कि भविष्यवाणी बदलना "इसे करने का अनुशंसित तरीका नहीं है"? 'NSFetchRequest' को अद्यतन करने के लिए आसान और क्लीनर भविष्यवाणी करें और एक नया fetch प्रदर्शन करें। एकाधिक 'NSFetchedResultsControllers' होने का अर्थ नहीं है। – gschandler

+1

आप सही हैं, मैं सोच रहा था कि जब दो अलग-अलग डेटा सेट शामिल होते हैं, जब डेटासेट नहीं बदल रहा है और केवल अनुमान है, तो एक एफआरसी ठीक काम करेगा। –

+0

सरल और कुशल समाधान! – Giovanni

संबंधित मुद्दे