NSSortDescriptor для удаления префикса "the" - PullRequest
5 голосов
/ 12 декабря 2010

У меня есть группа исполнителей, хранящихся в 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".

Есть идеи, как это исправить?

1 Ответ

3 голосов
/ 12 декабря 2010

После чата с несколькими людьми кажется, что сохранение «cleanName» в базе данных - лучший способ, и «нормализация переоценена».

...