Выборка Coredata с NSSortDescriptor по алфавиту и длине свойства
В сущности myCoredata (Persons) я хочу получить все персоны, отсортированные по алфавиту по длине имени. Я пробовал следующий код
NSSortDescriptor *nameSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"first_name" ascending:YES];
NSSortDescriptor *lengthSorter = [NSSortDescriptor sortDescriptorWithKey:@“first_name.length" ascending:YES];
[fetchRequest setSortDescriptors:@[lengthSorter, nameSortDescriptor]];
Но не повезло. Это совершенно неправильный подход? Как я должен делать что-то подобное с извлечением CoreData?
2 ответа
Вы правы, что это не сработает. Предикаты, которые используются для fetchRequest, превращаются в запросы MySQL, поэтому они не принимают все, что является допустимым предикатом (например, предикат WithBlock: например).
В этом случае я бы предложил добавить еще один столбец в таблице (свойство объекта) для firstNameLength
, Имейте ТОЛЬКО один способ установить имя, а также установить свойство nameLength одновременно (чтобы оно не вышло из синхронизации). Затем вы можете просто отсортировать по свойству nameLength, которое было предварительно рассчитано.
Также вы можете не захотеть использовать NSString.length, потому что это может не означать то, что вы думаете, что это значит. Письма с декоративными отметками (например, "резюме") могут иметь более длинную длину, чем вы хотите. Также смайлики могут быть длиной 2, 4 или 8 строк. Вместо этого вы можете посчитать составленные последовательности символов, используя enumerateSubstringsInRange:options:usingBlock:
Один из способов сделать это - добавить свойство с пользовательским геттером в подкласс вашего основного объекта данных. если вы делаете много базовых данных, я предлагаю что-то вроде mogenerator или встроенных функций для обработки генерации сущностей, чтобы вы не перезаписывали классы модели при каждом изменении модели.
@property (nonatomic, readonly, getter=getFirstNameLength) NSUInteger firstNameLength;
-(NSUInteger)getFirstNameLength {
return [firstName length];
}
Пока этот метод общедоступен в классе.h, вы сможете обращаться к нему так же, как к обычному свойству модели в своем предикате.