У меня есть группа художников, хранящихся в CoreData, и я хочу отсортировать их по имени, но игнорируя префикс «the». Так, например, «Битлз» будут отсортированы как «Битлз», вроде того, что делает iTunes / iPod.
Я попытался добавить собственное свойство cleanName
в свою модель исполнителя, чтобы его можно было использовать для сортировка с помощью:
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: implementation:
- (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];
}
Это работает, когда я добавляю нового исполнителя, скажем "The Beatles" в мой магазин. Исполнитель отсортирован как «Битлз» и отображается в моем разделе «Б». Но как только я выхожу из приложения и перезапускаю его, я получаю следующую ошибку, и табличное представление остается пустым:
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 - Б, как и должно быть). Но сортировка не работает, так как эта запись должна быть прямо перед "Bonobo".
Есть идеи, как это исправить?