2011-07-06 15 views
1

私のデータモデルには、DetailsLookupという2つのエンティティがあります。特定の属性値を持つ特定のLookupオブジェクトに関連するすべてのDetailsオブジェクトを見つけて、取り出した結果コントローラを介してそれらのオブジェクトを返す必要があります。コアデータ:別のエンティティのオブジェクトを返す述語

マイNSManagedObjectSubclasses:

@interface Details : NSManagedObject { 
@privateI 
} 
@property (nonatomic, retain) NSString * owner; 
@property (nonatomic, retain) NSString * introduction; 
@property (nonatomic, retain) NSString * id; 
@property (nonatomic, retain) NSString * title; 
@property (nonatomic, retain) NSString * created; 
@property (nonatomic, retain) NSString * modified; 
@property (nonatomic, retain) NSNumber * type; 
@property (nonatomic, retain) NSString * desc; 


@interface Lookup : NSManagedObject { 
@private 
} 
@property (nonatomic, retain) NSDate * search_date; 
@property (nonatomic, retain) NSString * search_phrase; 
@property (nonatomic, retain) NSSet* searchResults; 

私はそのsearch_phrase属性に基づいてLookupオブジェクトを検索し、関連するすべてのDetailsオブジェクトを取得し、フェッチ結果コントローラでそれらを返却する必要があります。

まず、Lookupオブジェクトを検索してから、DetailオブジェクトのNSSetを処理する必要があると思いますが、NSFetchedResultsControllerのNSSetを返す方法はわかりません。

私が試してみた:

NSPredicate *predicate =[NSPredicate predicateWithFormat:@"search_phrase = %@", self.searchPhrase]; 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

fetchRequest.predicate = predicate; 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Lookup" inManagedObjectContext:self.context]; 

[fetchRequest setEntity:entity]; 

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"search_phrase" ascending:NO]; 

[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.context sectionNameKeyPath:nil cacheName:@"Searches"]; 

私は右のLookupオブジェクトを見つけ、要求を持っているが、私は、フェッチ結果コントローラから関連Detailオブジェクトを取得する方法がわかりません。

+1

なぜ投票が停止するのですか? – user7865437

+0

元の質問は、不明瞭で不完全だったので、投票されました。誰にでもあなたが必要なものを見つけ出すのは難しかったです。私は、より有用な質問をするための追加情報を編集しました。 – TechZen

+0

ああ、私の自己をもっと鮮明にするために、次回はもっと頑張ります。 – user7865437

答えて

2

まず、あなたはDetailsLookupの間に定義された相互関係を持っていませんが、Detailsにただ一方通行Lookup。あなたはDetailからLookupに実行されているデータモデルのエンティティの両方に関係を追加し、それが設定されている必要があることはLookup.searchResultsのrecipocalを持っており、あなたのDetailクラスは次のようにプロパティの何かを必要とします:

相互関係は、あなたが見つけることができます持つ
@property (nonAtomic,retain) Lookup *lookup; 

Lookupオブジェクトで始まり、LookupオブジェクトがDetailオブジェクトで始まるオブジェクトを見つけることができます。

Detailオブジェクトのリストを表示するには、フェッチ結果コントローラのフェッチ要求をDetailエンティティに対してフェッチするように設定する必要があります。経験則として、フェッチ要求エンティティは常にオブジェクトをテーブルビューに表示するエンティティに設定します。

同様に、述語はDetailエンティティに対して実行されるため、Detailエンティティのプロパティで始まるキーパスに対して評価する述語が必要です。この場合、関連するLookupオブジェクトがsearch_phase属性を持つすべてのDetailsオブジェクトに値を提供する必要があります。だから、:今

NSPredicate *p=[NSPredicate predicateWithFormat:@"lookup.search_phrase==%@", self.searchPhrase]; 

セットアップあなたのthuslyフェッチ要求:

NSFetchRequest *fetch=[[NSFetchRequest alloc] init]; 
    NSEntityDescription *detailsEntity=[NSEntityDescription entityForName:@"Details" inManagedObjectContext:self.context]; 
    [fetch setEntity:detailsEntity]; 
    [fetch setPredicate:p]; 
    //.. set up a sort however you want the details to appear in the tableview 

が、これはあなたのNSFetchedResultsControllerにフェッチし、それはあなたが探しているDetailオブジェクトを返します与えます。要約すると

:あなたは柔軟性を持つことができますので、

  • 常にデータモデルで相互の関係を使用しています。
  • フェッチされた結果コントローラを使用する場合は、オブジェクトをテーブルビューに表示するエンティティにフェッチ要求のエンティティを設定します。
+0

これは私に非常に明確な優れた答えです...ありがとう!私はこれを実装し、結果を知ってもらいますよ、もう一度 – user7865437

+0

最後にそれは動作します、あなたの方法はありがとうございます;-)) – user7865437

1

あなたのサンプルコード、あるいは実際の関係のあるなしに答えるのは難しいが、ここに行く:

  • これはあなたのオブジェクトの数を含む結果セットを与え、テーブルA.上のあなたの最初のフィルタを実行します。
  • あなたのフィルタといえ追加する他のAND #Put name of the relationship here# IN (the results of 1)

何かを照会表B、リレーショナルデータベースなどのコアデータについて考えるのをやめるべきです。これはオブジェクトグラフです。コアデータは、データを格納するために異なるテーブルを使用しても使用しなくてもよい。あなたが気にするべきことは、オブジェクトとそれらの関係です。 私が正しく理解していれば、実際には1対多対、多対多が欲しいとは限りません。 その後、Bオブジェクトのクエリを一度に両方のクエリを実行することができるようになります: A.your.a.query == 'What you're querying for' AND your.b.querey == here

+0

これを処理しています..... – user7865437

+0

私はこれを試しました:述部= [NSPredicate predicateWithFormat:@ "type =%@ AND searchResults IN%@"、self.resource、lsrm.searchResults];しかし、私は無効な述語:nil RHS – user7865437

+0

これは全く運がないと言っているエラーを取得する、いずれかの私の骨をスローしたいですか? NSPredicate * predicate = [NSPredicate predicateWithFormat:@ "type =%@ AND searchResults IN%@"、self.resource、lsrm.searchResults] lsrm.searchResultsはLookupオブジェクトのNSSetです。理由: '述語の実装が実装されていません。 – user7865437

関連する問題