1

我有两个实体。客户和项目。一个客户有很多项目,但一个项目只能分配给一个客户。这是使用数据模型设计的。

  • 客户实体具有属性clientName和与许多项目的关系
  • 项目实体具有属性projectName和与一个客户的关系

我想从我的 ManagedObjectContext 中检索所有客户端,其中客户端按clientName升序排序,然后让该客户端的项目按projectName升序排列。

这是我当前的代码,我知道这是错误的,因为 Client 实体无法按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;

我看到了一个实现,他们获得了客户,然后手动对项目进行排序......但这有点贵,我希望在查询上下文时有功能可以做到这一点。

4

2 回答 2

0

您可以将自己的自定义属性添加到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

现在你只需要获取所有的客户,现在每个客户都有排序的项目。性能方面我不确定这是最好的方法,但我认为它可以使代码更清晰。

于 2010-10-16T00:45:52.333 回答
-1

尝试使用排序的关键路径,例如project.projectName在排序描述符中。这有点像在黑暗中拍摄,因为我自己没有尝试过,所以如果我错了不要杀我。

于 2010-10-15T15:31:16.987 回答