iOS

[iOS SDK][Core Data] 表示するデータの並び順・セクション名・フィルタを設定する方法

CoreData で、アトリビュート(属性)の値によって、表示するデータの並び順を変更、セクション名を設定、フィルタリングする方法を紹介します。

ベースは、「Master-Detail Application」で「Use Core Data」を選択したものとなっています。また、ARC を使用しています。

乱暴な書き方になってしまうかも知れませんが、メモとして残しておきます。

表示するデータの並び順を変更する

ascending:YES で昇順(ABC…)に設定。

selector:@selector(caseInsensitiveCompare:) で大文字小文字の区別をしないように設定。

- (NSFetchedResultsController *)fetchedResultsController
{

    // ...
    
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];

    // ...
    
    return __fetchedResultsController;
}

表示するデータのセクション名を設定する

UITableView に表示する際、アトリビュート “name_index” に入っているデータを section 名にする。

- (NSFetchedResultsController *)fetchedResultsController
{

    // ...
        
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"name_index" cacheName:nil];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;
    
    // ...
        
    return __fetchedResultsController;
}

表示するデータにフィルタをかける

アトリビュート “check” が 1 未満のレコードを表示。

- (NSFetchedResultsController *)fetchedResultsController
{
    
    // ...
        
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"check < 1"];
    [fetchRequest setPredicate:predicate];
    
    // ...
    
    return __fetchedResultsController;        
}