У меня есть группа исполнителей, хранящихся в CoreData, и я хочу отсортировать их по имени, но игнорирую префикс "the". Так, например, «Битлз» будут отсортированы как «Битлз», что-то вроде того, что делает iTunes / iPod.
Итак, я попытался добавить собственное свойство cleanName
к моей модели Artist, чтобы его можно было использовать для сортировки с:
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"cleanName" ascending:YES];
Это, очевидно, приводит к остановке приложения, поскольку cleanName
не является свойством SQLEntity:
...keypath cleanName not found in entity <NSSQLEntity Artist id=1>
Я знаю, что могу сохранить cleanName в магазине, но мне это кажется неправильным. Один новый атрибут только для того, чтобы лишить имени префикс «the»? Действительно?
Поэтому вместо этого я попытался создать подкласс NSSortDescriptor с помощью пользовательского метода compareObject: toObject: реализация:
- (NSComparisonResult)compareObject:(Artist*)artist1 toObject:(Artist*)artist2 {
NSString *cleanString1 = [artist1.name stringByReplacingOccurrencesOfString:@"the " withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [artist1.name length])];
NSString *cleanString2 = [artist2.name stringByReplacingOccurrencesOfString:@"the " withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [artist2.name length])];
return [artist1.cleanName compare:artist2.cleanName options:NSCaseInsensitiveSearch];
}
Это работает, когда я добавляю нового художника, скажем "Битлз", в мой магазин. Художник сортируется как "Битлз" и отображается внутри моего раздела "B". Но как только я закрываю приложение и перезапускаю его, я получаю следующую ошибку, и табличное представление просто остается пустым:
sectionIndex A for Apparat
sectionIndex B for Bonobo
sectionIndex M for Misteur Valaire
sectionIndex M for Moderat
sectionIndex P for Paul Kalkbrenner
sectionIndex R for Röyksopp
sectionIndex B for The Beatles
NSFetchedResultsController ERROR: The fetched object at index 6 has an out of order section name 'R. Objects must be sorted by section name'
Как вы можете видеть из того, что я регистрирую, заголовки разделов хороши (заголовок раздела The Beatles - B, как и должно быть). Но сортировка не работает, так как эта запись должна быть прямо перед "Bonobo".
Есть идеи, как это исправить?