Как отсортировать реляционные данные? - PullRequest
0 голосов
/ 19 марта 2012

Только маленький вопрос:

У меня есть сущность X с отношением ко многим к сущности Y

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

Если вы выберете один из X в tableView, все реляционные Y будут отображены во втором tableView. Результат этой выборки также включает все реляционные Y для каждого X, поэтому мне не нужно делать дополнительную выборку для Y - но это приводит к моей проблеме: Y расположены в совершенно случайном порядке (который также меняется при каждом перезапуске приложения) - но я хочу, чтобы они сортировались по дате (<- атрибут в объекте Y) ... как я могу это сделать? </p>

Вот выборка - код

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Customer" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];

NSError *error = nil;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
    // Handle the error.
}

[self setCustomersArray:mutableFetchResults];

и результат выглядит примерно так:

Entity X-1
 attribute-x-1
 attribute-x-2
 relation-attribute
  relation-entity-y-1
   attribute-y-1
   attribute-y-2
  relation-entity-y-1
   attribute-y-1
   attribute-y-2
Entity X-2
 attribute-x-1
 attribute-x-2
 relation-attribute
  relation-entity-y-1
   attribute-y-1
   attribute-y-2

может быть, это лучший пример:

Customer
 name: Bert
 age: 10
 customerMeasureRealtions
  Measure
   score: 5
   date: 10.10.2010
  Measure
   score: 9
   date: 20.20.2000
Customer
 name: Steve
 age: 20
 customerMeasureRealtions
  Measure
   score: 7
   date: 07.07.2007

после выборки «Клиенты» сортируются по «имени». Но если я получаю доступ к «Мерам» через «Клиента», порядок «Меров» будет случайным, но я хочу, чтобы они сортировались по «дате».

код для доступа к мерам («клиент» - это объект-объект-клиент или модель), («measureForCustomer» - это клиентские условия Realtions):

- (void)loadMeasureDataForCustomer:(Customer *)customer
{
NSSet *customerSet = customer.measuresForCustomer;
measuresArray = [NSMutableArray arrayWithArray:[customerSet allObjects]];
[measuresTable reloadData];
}

Ответы [ 2 ]

0 голосов
/ 19 марта 2012

Используйте один из методов сортировки NSSet.

Попытка:

- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors

Или, если вы получаете NSArray из NSSet, у вас есть целый ряд методов сортировки в NSArray, из которых можно выбрать:

Sorting
– sortedArrayHint
– sortedArrayUsingFunction:context:
– sortedArrayUsingFunction:context:hint:
– sortedArrayUsingDescriptors:
– sortedArrayUsingSelector:
– sortedArrayUsingComparator:
– sortedArrayWithOptions:usingComparator:

Они взяты из документов NSArray и NSSet API.

0 голосов
/ 19 марта 2012

Я думаю, что есть два способа сделать это:

  1. Инициируйте второй запрос к вашей базе данных и извлеките «показатели» для данного Клиента. Взгляните на Базовые данные, сортируя для этого дочерние объекты один-ко-многим .
  2. Перенесите NSSet в NSArray и отсортируйте его на месте. NSSet всегда неупорядочен. Посмотрите на Как отсортировать NSArray по алфавиту? . Или документация Apple: sortedArrayUsingDescriptors в сочетании с NSSortDescriptor .
...