【iOS】「Core Data」を利用したiPhoneアプリ開発⑦:ソース情報を追加
今回は久しぶりに「CoreData」についてです!
ソート機能を実装する上で色々と試してみると幅広く使えそうだったのでメモ代わりに押さえておきます。
昇順、降順どちらを指定した場合でも、文字列や数値の「新⇔古」「大⇔小」がはっきりしていればテーブルビューの見た目も綺麗に整列しますが、比較対象に同じ値が多い場合などには複数ソート条件があればもっと綺麗な列になってくれるはずではないかと...とりあえずチャレンジあるのみ!ってことで
とりあえずサンプルコードから見てみます。
デフォルトのソート例
// 新しいインスタンスを作成する NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"SampleSort" inManagedObjectContext:self.managedObjectContext]; // 取得するエンティティとして設定する [fetchRequest setEntity:entity]; // 一度に取得するオブジェクト数の上限値を設定する [fetchRequest setFetchBatchSize:50]; // ソート情報を作成する NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]; NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; // 作成したソート情報を設定する [fetchRequest setSortDescriptors:sortDescriptors]; // プロパティに設定するインスタンスを作成する NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"]; aFetchedResultsController.delegate = self; // プロパティにセットする self.fetchedResultsController = aFetchedResultsController; // データベースから内容を読み込む NSError *error = nil; if (![self.fetchedResultsController performFetch:&error]) { // 失敗したらログを表示して終了する NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); }
デフォルトでは一つの条件のみで実行されるため、指定した「date」時間順にソートが行われます。
ソート情報を追加
NSArrayのソートには「NSSortDescriptor」を使った方法で実装します。
NSSortDescriptorを追加したい条件数に合わせて用意します。
NSArrayに条件分のNSSortDescriptorを追加することで、複数条件にあわせた順序で並び替えてくれます。
「date」の「ascending」をNO(降順)にします。
「number」の「ascending」をYES(昇順)にして条件を指定します。
// ソート情報を作成する NSSortDescriptor *sortDescriptor_1 = [[NSSortDescriptor alloc] initWithKey:@"date"@ ascending:NO]; // ソース情報追加 NSSortDescriptor *sortDescriptor_2 = [[NSSortDescriptor alloc] initWithKey:@"number" ascending:YES]; NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor_1,sortDescriptor_2, nil];
ソート情報追加後のコード
// 新しいインスタンスを作成する NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; // エンティティを取得する NSEntityDescription *entity = [NSEntityDescription entityForName:_sortEntityStr inManagedObjectContext:self.managedObjectContext]; // 取得するエンティティとして設定する [fetchRequest setEntity:entity]; // 一度に取得するオブジェクト数の上限値を設定する [fetchRequest setFetchBatchSize:50]; // ソート情報を作成する NSSortDescriptor *sortDescriptor_1 = [[NSSortDescriptor alloc] initWithKey:@"date"@ ascending:NO]; // ソース情報追加 NSSortDescriptor *sortDescriptor_2 = [[NSSortDescriptor alloc] initWithKey:@"number" ascending:YES]; //NSSortDescriptorをNSArrayに設定する NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor_1,sortDescriptor_2, nil]; // 作成したソート情報を設定する [fetchRequest setSortDescriptors:sortDescriptors]; // プロパティに設定するインスタンスを作成する NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"]; aFetchedResultsController.delegate = self; // プロパティにセットする self.fetchedResultsController = aFetchedResultsController; // データベースから内容を読み込む if (![self.fetchedResultsController performFetch:&error]) { // 失敗したらログを表示して終了する NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); }
ソートされる実行結果ですが、@”date”⇒@”number”の順にソートが行われます。
目的に合わせた順番で設定できるので、色んな条件で切れ替えなどが出来そうですね!
まだまだCoreDataについてアップしたいと思います!
今回はここまで!!
コメントをどうぞ