Основные данные - использование переходных свойств в Group By - PullRequest
6 голосов
/ 20 февраля 2012

Я создаю UITableView с некоторыми агрегированными данными. Попутно заголовки разделов необходимо использовать для сортировки и группировки ячеек табличного представления.

Проблема в том, что я хотел бы использовать Transient Property в NSFetchRequest для генерации заголовков разделов и сортировки результатов. Проблема заключается в том, что при настройке NSFetchRequest я получаю «NSInvalidArgumentException», причина: «Неверный путь к ключу player.fullName передан в setPropertiesToFetch».

Основной сущностью для NSFetchRequest является сущность Player со свойствами: firstName & lastName. Для сортировки и группировки данных было введено временное свойство 'fullName'. Это простая конкатенация свойств lastName и firstName.

До сих пор пытались:

a) Определение метода - (NSString *) fullName

b) Определение @property (неатома, только для чтения) NSString * fullName

в) Добавление @dynamic fullName

d) Добавление атрибута fullName к объекту Player и его переходный процесс.

Существуют ли какие-либо идеи или есть возможность выбрать временные свойства в NSFetchRequest, который включает предложение group by.

Любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 21 февраля 2012

Ну, в конце концов, кажется, что включить временное свойство в группу с помощью NSFetchResults с группой By невозможно.

Отличное предложение от jrturton близко.В конце концов, переходное свойство fullName было достаточно легко сгенерировать при обновлении сущности и обновлялось только очень редко, поэтому решение состояло в том, чтобы прекратить использование переходного свойства и создать полноценный атрибут.Просто думайте об этом как о чрезвычайной денормализации.

решение было установить следующее

-(void)setLastName:(NSString*)aName
{
    [self willChangeValueForKey: @"lastName" ];
    [self setPrimitiveValue: aName forKey: @"lastName" ];
    [self updateFullName];
    [self didChangeValueForKey: @"lastName" ];
}

-(void)setFirstName:(NSString*)aName
{
    [self willChangeValueForKey: @"firstName" ];
    [self setPrimitiveValue: aName forKey: @"firstName"];    
    [self updateFullName];
    [self didChangeValueForKey: @"firstName" ];
}

Это обновит fullName как свойство объекта Player и устранит мои проблемы.Надеюсь, это поможет.

2 голосов
/ 20 февраля 2012

Вы не можете задействовать временные свойства в своем запросе на выборку, но вы можете использовать их для пути ключа имени раздела, если они отображаются в том же порядке.

Попробуйте отсортировать ваш запрос на выборку по lastName и firstName (два отдельных дескриптора сортировки в массиве), затем используйте player.fullName в качестве ключевого пути имени раздела при создании вашего контроллера полученных результатов (только a и b из списка выше) ,

...