Сортировка отношения ко многим при вызове NSFetchRequest - PullRequest
1 голос
/ 15 октября 2010

У меня есть две сущности.Клиент и Проект.У клиента много проектов, но проект может быть назначен только одному клиенту.Это было разработано с помощью модели данных.

  • Сущность клиента имеет атрибут clientName и отношение ко многим проектам
  • Сущность проекта имеет атрибут projectName и отношение к одному client

Я хочу получить всех клиентов из моего ManagedObjectContext, где клиенты сортируются по clientName по возрастанию, а затем иметь проекты для этого клиента по projectName по возрастанию.

Это мой текущий код, где я ЗНАЮ, что это неправильно, так как для клиента нет способасущность для сортировки по имя_проекта :

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

// Creating the sort descriptors array.
NSSortDescriptor *clientSort = [[NSSortDescriptor alloc] initWithKey:@"clientName" ascending:YES];
// this next row is super wrong
NSSortDescriptor *projectSort = [[NSSortDescriptor alloc] initWithKey:@"projectName" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:clientSort. projectSort, nil];
[fetchRequest setSortDescriptors:sortDescriptors];  

NSError *error;
// Assign to NSArray of ViewController
clientArray = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];

После того, как это было присвоено clientArray, я хочу перейти к другому методу и попросить проекты и иметь их в порядке возрастания,Пример:

Client *temp = (Client *)[clientArray objectAtIndex:selectedClient];        
NSArray *projectsArray = [temp.projects allObjects];
Project *project = [projectsArray objectAtIndex:selectedProject];       
return project.projectName;

Я видел реализацию, где они получали клиентов, а затем сортировали проекты вручную ... Но это довольно дорого, и я надеюсь, что есть функции, которые делают это, когда получает контекстопрашивается.

Ответы [ 2 ]

0 голосов
/ 16 октября 2010

Вы можете добавить свое собственное пользовательское свойство к Client

@interface Client : NSManagedObject {
}

// ... other properties
@property (nonatomic,readonly) NSArray* orderedProjects;

@end

@implementation

// ... @dynamic etc

@dynamic orderedProjects;

- (NSArray*)orderedProjects {
    NSArray* sort = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"projectName" ascending:YES]]
    return [[self.projects allObjects] sortedArrayUsingDescriptors:sort];
}

@end

Теперь вам просто нужно выбрать все клиенты, у каждого из которых теперь есть отсортированные проекты.С точки зрения производительности, я не уверен, что это лучший подход, но я думаю, что он делает код чище.

0 голосов
/ 15 октября 2010

Попробуйте использовать ключевой путь для сортировки, например project.projectName в дескрипторе сортировки.Это немного похоже на выстрел в темноте, потому что я сам не пробовал, так что не убивай меня, если я ошибаюсь.

...