2013-07-18 2 views
7

中の化合物述語を作成します。私はのリストを取得するための述語を作成しとして、私は3つのエンティティ(クラス、学生、ExamRecord)とその関係地域とのコアデータに取り組んでいますHI coreDataのXcodeのiphone

Class<------>> Students <------> ExamRecord 

クラス5thの学生。これで

NSString * fmt2 = @"studentsToClass.className=%@"; 
NSPredicate * p2 = [NSPredicate predicateWithFormat:fmt2,@"5th",nil]; 

は、私は今、私はまた、フェッチされた学生に別のフィルタを適用したい

第五クラスの生徒全員を取得しています。

は、その試験記録「結果は」「合格」.resultでどのように私は、この中の化合物述語を利用することができます

ExamResultエンティティの学生のための属性である学生を取得しますか?

私が間違っているなら、私を修正してください

すべてのヘルプは

おかげ

を理解されるであろう

答えて

26

あなたは、化合物の述語使用することができます。

NSPredicate *p1 = [NSPredicate predicateWithFormat:@"studentsToClass.className = %@", @"5th"]; 
NSPredicate *p2 = [NSPredicate predicateWithFormat:@"studentsToExamRecord.result = %@", @"Pass"]; 
NSPredicate *p = [NSCompoundPredicate andPredicateWithSubpredicates: @[p1, p2]]; 

それとも、単にでテストを組み合わせを「AND」:

NSPredicate *p = [NSPredicate predicateWithFormat:@"studentsToClass.className = %@ AND studentsToExamRecord.result = %@", 
     @"5th", @"Pass"]; 

predicateWithFormatの引数リストは、nilで終了しないことに注意してください。 引数の数は、書式指定子の数によって、 文字列の形式で決定されます。

+0

@Fogmeister:私は知りたいです。 –

+0

@MartinR助けていただきありがとうございますが、私はまだStudent.My述語の結果を取得できません:studentsToClass.className == "5th" AND studentsToExamRecord.result == "Pass" PLeaseヘルプと私が間違っている場所を修正してください – sagar

+0

@sagar:エラーが出るか、結果が出ませんか?おそらく、エンティティの定義方法とオブジェクトの作成方法を示します。述語を省略すると、すべてのオブジェクトが得られますか? –

0

まず、引用された述語は実際には既に間違っています。プロパティではなく、管理対象オブジェクトを参照する必要があります(のnameではありません)。

[NSPredicate predicateWithFormat:@"class = %@", classObject]; 

また、実際に変数とプロパティに読みやすい名前を選択する必要があります。したがって、fmt2ではなく、formattingStringではありません。 studentsToClassではなくform( "class"は目的語Cの特別な単語です)。あなたはその考えを得る。

だからあなたの所望の化合物の述語は、この(ショートバージョン)のように行われます。

[NSPredicate predicateWithFormat:@"class = %@ && record.result = %@", 
     classObject, @"Pass"]; 

複雑なバージョン、あなたは本当に(私は疑う)抽象度の高い必要がある場合:

classPredicate = [NSPredicate predicateWithFormat:@"class = %@", classObject]; 
resultPredicate = [NSPredicate predicateWithFormat:@"record.result = %@", @"Pass"]; 
finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates: 
    @[classPredicate, resultPredicate]]; 
+0

2つのサブ表現を1つに結合するにはどうすればいいですか?つまり、A OR Bで、AとBではありません。 –

+0

それは別のSOF質問です;-)。 – Mundi

+0

はい私はそれを発見しました:)それはorPredicateWithSubpredicatesを使用して行われます: –

2

まず、student - classの関係studentsToClassを実際に呼び出すべきではありません。関係の名前は、相手のタイプがどのタイプのオブジェクトであるかを反映する必要があります。

など。

この場合、Classとの関係はclassと呼ばれます。オブジェクトにはClassエンティティが1つあるためです。 逆の関係はclassToStudentと呼ばれるべきではありませんstudentsと呼ばれるべきです。そのオブジェクトには、StudentsNSSetがあるからです。ただ、これに追加する

EDIT

。関係の名前は、そこにある理由を説明する必要があります。この関係はクラスから生徒までの関係であることがわかりますが、「classToStudent」と呼ぶと何も説明されません。また、授業から学生への第二の関係がある場合はどうなりますか?あなたはそれを何と呼びますか? attendeesまたはpupilsまたはattendingStudentsなどと呼ぶと、それは関係の意味を与えます。

私は、私はそれらを呼び出すと、あなたはそれが少し簡単に理解することができます表示されますどのようにそれらを呼び出すつもりです。この例では、溶液

...とにかく

...

NSPredicate *classPredicate = [NSPredicate predicateWithFormat:@"class.className = %@", @"5th"]; 
NSPredicate *passPredicate = [NSPredicate predicateWithFormat:@"result.name = %@", @"Pass"]; 

NSCompoundPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[classPredicate, passPredicate]]; 
+0

あなたの助けてくれてありがとうしかし、私はまだstudent.My述語を取得できません:studentsToClass.className == " AND studentsToExamRecord.result == "Pass"ヘルプを作成し、私が間違っている場所で修正してください – sagar

関連する問題