1

私は2つのエンティティを持っています。クライアントとプロジェクト。クライアントには多くのプロジェクトがありますが、プロジェクトは 1 つのクライアントにしか割り当てることができません。これはデータモデルで設計されています。

  • クライアント エンティティには属性clientNameと多数のプロジェクトへの関係があります
  • プロジェクト エンティティには属性projectNameと 1 つのクライアントとの関係があります

クライアントがclientNameの昇順でソートされているManagedObjectContextからすべてのクライアントを取得し、そのクライアントのプロジェクトを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 に答える