【iOS】Core Dataでfetchされたデータの絞り込み検索(なんとか解決)

なんとも単純な箇所がネックだった。
前回、Core Dataに登録したデータをUISearchBarで絞り込みしようと思い、以下のメソッドを追加した。

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption

上記コードは、Cocoaの日々さんの記事、およびiOS Developer Libraryのサンプルコードを参考にしました。ありがとうございます。

んで

前回のクラッシュは何が原因だったかというと、キャッシュ名でした。元々、

- (NSFetchedResultsController *)fetchedResultsController

というメソッドの中で

NSFetchedResultsController *aFetchedResultsController =
    [[NSFetchedResultsController alloc]
        initWithFetchRequest:fetchRequest
        managedObjectContext:self.managedObjectContext
        sectionNameKeyPath:nil
        cacheName:@"Root"];

という箇所があります。ここで、cacheName:@"Root"でRootと指定しています。しかし、

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSString *query = self.searchDisplayController.searchBar.text;
    if (query && query.length) {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", query];
        [self.fetchedResultsController.fetchRequest setPredicate:predicate];
        
        [NSFetchedResultsController deleteCacheWithName:@"Root"];
    }
    
    NSError *error = nil;
    if (![self.fetchedResultsController performFetch:&error]) {
        // Handle error
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }
}

の中で、deleteCacheWithName:@"Root"というとこ、ここを"UserName"と書いていたんす。これを合わせたら、OKでした。スクリーンショットを以下に。

最初にデータを登録しておきます。

んで、Search欄にフォーカスをあてて、

例えば大文字Sを入力すると...

では次に、大文字Bを入力すると...

どちらにもない文字を入力すると...


と、いうわけで、次は、登録したレコードの更新を。