2011-08-15 10 views
2

かなり複雑なオブジェクトモデルで作業していますが、一部のフェッチをセクションに分けてテーブルビューに表示するのに問題があります。セクション内のオブジェクトのフェッチとグループ化

私は、Meetingの管理オブジェクトを、プロジェクト、クライアントなどのいくつかの異なる「ポケット」にグループ化する必要があります。いくつかの理由から私はMeetingエンティティに関連付けることのできるタグとしてこれらを実装することに決めました。

だから私はタイプと値を有し、2つの間の関係を確立し、新たなTagエンティティ作成されました:私はプロジェクトとの出会いを関連付けたい場合は、私はタグを作成

Meeting <<-->> Tag 

を名前 'project'と値 'Project Name'を作成し、それを関係を介してMeetingエンティティに追加します。

私は当初NSFetchedResultsControllerを使うことを考えましたが、私は本当に理解できないすべての問題をすべて取り上げています。

例えば、これは(私は不必要なビットを省略しています)フェッチ:この特定のケースで

NSFetchRequest *fetch = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:[Meeting entityName] inManagedObjectContext:moc]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tags.name contains[] 'client'"]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
[fetch setEntity:entity]; 
[fetch setPredicate:predicate]; 
[fetch setSortDescriptors:sortDescriptors]; 
NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetch 
                     managedObjectContext:moc 
                     sectionNameKeyPath:@"self.tags.value" 
                       cacheName:nil]; 

をインクルードフェッチは、作業を行いますが、どういうわけか、私だけではなくTagsclientとが提示され、予期しない結果を取得しています値がprojectのものもありますか?

私はtags.name == 'project'に私の述語を変更した場合、私は例外を取得:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here' 

私はおそらくここに基本的な何かが欠けていると、確かに私は述語と多くの経験を持っていますが、対象に、Appleのドキュメントはありません望みをたくさん残す。

私が理解していない副疑問とか、どちらかといえば、なぜselfを私のsectionNameKeyPathにself.tags.valueに追加する必要がありますか?それは何をするためのものか??私はそれを追加しない場合は、この場合、私は例外も同様にスローさ:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid to many relationship in setPropertiesToFetch: (tags.value) 

最後に、この場合でフェッチ結果コントローラを使用する代わりに、何ですか?それは、最初にTagの各インスタンスを取得し、どこにname == 'project'の配列を反復してそれに関連付けられた会議オブジェクトをプルするかをまとめたものですか?非常に非効率的だと思われますが、私は今考えていることがあります。他のアイデアがあれば、私は彼らの意見を聞きたいと思っています。お時間を事前に

多くのおかげで、

Rogメール

答えて

3

問題がMeetingがあり、多くのことをtags、あなたが集計操作を使用する必要があるとしているようであるかもしれませんタイプclientであり、それらをclientNameでグループ化します。仕事をするclientNameキーのパスについて、あなたは一時プロパティを実装する必要があります:

- (NSString *)clientName { 
    [self willAccessValueForKey:@"clientName"]; 

    // Set clientName to the value of the first tag with name 'client' 
    NSString* clientName = @"..."; 

    [self didAccessValueForKey:@"clientName"]; 
    return clientName; 
} 

あなたNSManagedObjectサブクラスの数がclientNameプロパティが必要な場合は、一般的な抽象NSManagedObjectサブクラスでそれを実装し、あなたを作ることができます具体的なサブクラスはそれを継承します。

+0

ありがとう@Nathan de Vries、これに時間を割いていただきありがとうございます。 – Rog

1

は、 "[NSPredicate]に、Appleのドキュメントを希望する多くの葉" - 完全に合意されました!タグはコレクションがあるので

tags.nameがあり、それら

の3私はあなたが"tags contains %@", projectTagのような何かをしたいが、私は、構文のか分からないと思います(さんが言わせて)、何のオブジェクトがありません、有効ではありません。

NSFetchRequest *fetch = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:[Meeting entityName] inManagedObjectContext:moc]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY tags.name contains[cd] 'client'"]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
[fetch setEntity:entity]; 
[fetch setPredicate:predicate]; 
[fetch setSortDescriptors:sortDescriptors]; 
NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetch 
managedObjectContext:moc 
sectionNameKeyPath:@"clientName" 
cacheName:nil]; 

つまりは私にtagsANYすべてMeetingオブジェクトのリストを与える:"%@ IN %@", projectTag, thing.tags

関連する問題