2012-01-16 5 views
2

述語とコアデータを頭に入れようとしています。私はこのようなモデルを持っています。多対多の述語

ハウス< - >>ルーム(ハウスは、多くの部屋を持っています)
ルーム< < - >>備品(お部屋には多くの備品を持っており、多くの備品が部屋に所属することができます)
備品< - >> Fixture_Types(

"House"を持っていて、 "room" == "kitchen"(または何でも)という固有のFixture_typeをすべて取得する必要がある場合、私の述語はどのように見えるべきですか?

ありがとうございます!

+0

照明器具は2つの部屋に同時にどのように属しますか? –

+0

@MarkAdams - 複数の部屋に再利用される器具として考えてください。それは標準的な正規化です。たとえば、EmployeeテーブルとPositionテーブルがあるデータベースを考えてみましょう。従業員は多くのポジションを取ることができ、ポジション(たとえば会計)は多くの従業員によって保持されます。 _tweeznasty_のRoom-to-Fixturesの関係にも同じロジックが適用されます。 – Jeremy

+0

私は正規化を理解していますが、私が理解していないことは、 'Fixture'の単なるインスタンスが2つの部屋に同時にどのように属し得るかです。あなたの従業員の類推の後、多面的な関係は、会計の位置が人によって占められている実際の位置ではないので、「部屋」と「固定具のタイプ」の間にあるべきです、それは複数の人に適用できるタイプです。 –

答えて

1

私はそれを理解したと思います。ここに私がしたことがあります。

最上位のオブジェクトハウスとその子供用の部屋 - キッチンを取得します。

Room *room = [house.rooms objectAtIndex:someIndex]; 

私はそう設定され、表示順序を持っている:

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"displayOrder" ascending:YES]; 

私は、定義された述語を持つオブジェクトを取得するために、ヘルパー関数を持っていますこだわり

+(NSArray *)objectsForEntityNamed:(NSString *)name withPredicate:(NSPredicate *)predicate inContext:(NSManagedObjectContext *)context{ 
    NSEntityDescription *entity = [NSEntityDescription entityForName:name inManagedObjectContext:context]; 

    NSFetchRequest *req = [[NSFetchRequest alloc] init]; 
    [req setEntity:entity]; 
    [req setPredicate:predicate]; 
    NSError *error = nil; 

    NSArray *array = [context executeFetchRequest:req error:&error]; 

    if (array == nil){ 
     NSException *exception = [NSException exceptionWithName:CoreDataExeption reason:[error localizedDescription] userInfo:nil]; 

     [exception raise]; 

    } 
    return array; 

} 

そして今、ここで、述語のfixture_typesは、Fixture_TypesとFixtureの逆関係です。もちろん、あなたが明確な操作を行うことができますが、私のDBは正規化されているので、私はとにかくユニークな結果を得る必要があります:あなたが持っている場合は、

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY fixture_types IN %@", room.fixtures]; 

NSArray *fixture_types = [[CDUtilities objectsForEntityNamed:@"Fixture_Types" withPredicate:pred inContext:[house managedObjectContext]] sortedArrayUsingDescriptors:[[NSArray alloc] initWithObjects:descriptor, nil]]; 

・ホープこれは誰かに役立ちますこれを行うには良い方法があれば私に知らせたり私がどのようにそれをやったかについての質問。

関連する問題