使用NSFetchedResultsController搜索核心数据实体记录

时间:2016-07-05 04:23:40

标签: ios core-data nsfetchedresultscontroller

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

我的数据库中的一个列(属性)有一个长字符串(由空格分隔,如句子)。我想为该句子中的每个单词实现一个开头 - 我的应用程序应该列出db记录,如果其中一个单词开始与搜索单词。

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

记录1 - 你好嗨你好你好吗? 记录2 - 嗨你好 记录3 - 测试嗨

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

1 个答案:

答案 0 :(得分: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;
}