[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;
}