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

Posted

技术标签:

【中文标题】使用 NSFetchedResultsController 搜索核心数据实体记录【英文标题】:Search Core Data Entity Records with NSFetchedResultsController 【发布时间】:2016-07-05 04:23:40 【问题描述】:

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

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

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

记录 1 - 你好 你好 你好吗 记录 2 - 你好你好 记录 3 - 测试 Hi

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

【问题讨论】:

【参考方案1】:

您可以使用以下代码:

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;

【讨论】:

以上是关于使用 NSFetchedResultsController 搜索核心数据实体记录的主要内容,如果未能解决你的问题,请参考以下文章

核心数据保存竞争条件错误

在 Swift 3 中难以配置 NSFetchedResultsController

为啥 beginUpdates/endUpdates 会重置表视图位置以及如何阻止它这样做?

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?