2016-07-05 92 views
-1

我已经实现了一个表视图,它列出了来自核心数据实体的数据。我有大量存储在Core Data中的数据(大约6000多条记录 - 静态数据)。现在我想用NSFetchedResultsController在表视图中实现搜索。使用NSFetchedResultsController搜索核心数据实体记录

我DB中的一列(属性)有一个长字符串(用空格分隔)。我希望为该句子中的每个单词实施开始 - 如果单词的其中一个词开始于搜索词,我的应用程序应列出db记录。

例如,这里是我的数据样本:

记录1 - 你好你好你好你怎么样 记录2 - 嗨你好 记录3 - 测试嗨

现在,如果我搜索“你好” ,它应该列出Record-1和Record-2。

回答

0

您可以使用下面的代码:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", searchText]; 
[[_fetchedResultsController fetchRequest] setPredicate:predicate]; 
[[_fetchedResultsController fetchRequest] setFetchLimit:50]; 

或者,如果你会使用搜索结果控制器

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 
    NSInteger searchOption = controller.searchBar.selectedScopeButtonIndex; 
    return [self searchDisplayController:controller shouldReloadTableForSearchString:searchString searchScope:searchOption]; 
} 

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption { 
    NSString* searchString = controller.searchBar.text; 
    return [self searchDisplayController:controller shouldReloadTableForSearchString:searchString searchScope:searchOption]; 
} 

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString*)searchString searchScope:(NSInteger)searchOption { 

    NSPredicate *predicate = nil; 
    if ([searchString length]) 
     if (searchOption == 0) // full text, in my implementation. Other scope button titles are "Author", "Title" 
      predicate = [NSPredicate predicateWithFormat:@"title contains[cd] %@ OR author contains[cd] %@", searchString, searchString]; 
     else 
      // docs say keys are case insensitive, but apparently not so. 
      predicate = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", [[controller.searchBar.scopeButtonTitles objectAtIndex:searchOption] lowercaseString], searchString]; 

    [fetchedResultsController.fetchRequest setPredicate:predicate]; 

    NSError *error = nil; 

    if (![[self fetchedResultsController] performFetch:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    }   

    return YES; 
}