The fetched object at index ….. has an out of order section name
今日はCoreDataをいじっていたら表題のエラーに出くわしたので、それを投稿したい。
対処としては簡単なのだが、なんかイマイチな仕様だなぁ・・・とモヤッたので書きたいのである。
さっそく、どんなコードを書いていたのかというと。
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@“clothes”
inManagedObjectContext:context];
[request setEntity:entity];
NSSortDescriptor *sd2 = [[NSSortDescriptor alloc] initWithKey:@“color” ascending:YES];
NSSortDescriptor *sd3 = [[NSSortDescriptor alloc] initWithKey:@“size” ascending:YES];
request.sortDescriptors = [NSArray arrayWithObjects:sd2,sd3, nil];
NSDictionary *entityProperties = [entity propertiesByName];
NSMutableArray *properties = [NSMutableArray arrayWithObject:
[entityProperties objectForKey:@“sex”]];
[properties addObject:[entityProperties objectForKey:@"color"]];
[properties addObject:[entityProperties objectForKey:@"size"]];
[request setPropertiesToFetch:properties];
[request setResultType:NSDictionaryResultType];
NSFetchedResultsController *controller =
[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:@“sex” cacheName:nil];
controller.delegate = self;
[controller performFetch:nil];
こんな感じなのである。performFetchをしたところで、エラーを出力してフェッチできないという状態。
まあ、メッセージにある通り、セクション指定をしてあるにもかかわらず、そのデータで区切れないデータだったのでエラーとしたようである。
・・・略・・・・
NSSortDescriptor *sd2 = [[NSSortDescriptor alloc] initWithKey:@“color” ascending:YES];
NSSortDescriptor *sd3 = [[NSSortDescriptor alloc] initWithKey:@“size” ascending:YES];
request.sortDescriptors = [NSArray arrayWithObjects:sd2,sd3, nil];
・・・中略・・・・
[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:@“sex” cacheName:nil];
なので、ソート条件に追加してやる
・・・略・・・・
NSSortDescriptor *sd1 = [[NSSortDescriptor alloc] initWithKey:@“sex” ascending:YES];
NSSortDescriptor *sd2 = [[NSSortDescriptor alloc] initWithKey:@“color” ascending:YES];
NSSortDescriptor *sd3 = [[NSSortDescriptor alloc] initWithKey:@“size” ascending:YES];
request.sortDescriptors = [NSArray arrayWithObjects:sd1,sd2,sd3, nil];
・・・中略・・・・
[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:@“sex” cacheName:nil];
うまく動作!
何がモヤっとしたかというと、セクション区切りに使う場合には、その項目はプログラムの挙動的にはソートされていないと実現できないだろうという確信があったんですが、あえて、それはソート条件に入れてなかったんですよ。
だって、セクションに指定してますよ、ってメソッドに入ってますからね。
[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:@“sex” cacheName:nil];
で、コンパイラエラーになりもしなけりゃ、実行時エラーにもならない。
お!動くじゃん。賢いね!と思ってたら、突然動かない。で、調べたら表題のエラー。
このエラー、データがたまたまセクション区切りできるように綺麗にデータベースに入ってると発生しないんですよ。ひどい仕様だと思いません?
ということでいつまでもボヤいていても仕方ないので、今日はこの辺で。
ではでは。