create a Compound Predicate in coreData xcode iphone

You can use a compound predicate:

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

Or you simply combine the tests with "AND":

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

Note that the argument list of predicateWithFormat is not nil-terminated. The number of arguments is determined by the number of format specifiers in the format string.


First, you shouldn't really call the student - class relation studentsToClass. The name of the relation should reflect what type of object is at the other end.

E.g.

In this case the Student relation to Class should be called class because the object there is a single Class entity. The inverse relation should not be called classToStudent it should be called students because the object there is a NSSet of multiple Students.

EDIT

Just to add to this. The name of the relation should explain WHY it is there. We can see that the relation is from class to student but if you call it "classToStudent" it doesn't explain anything. Also, what if you have a second relation from class to student? What do you call that. If you call it attendees or pupils or attendingStudents etc.. it gives the relation meaning.

SOLUTION

In this example I'm going to call them how I would call them and you will see it makes it a bit easier to understand...

Anyway...

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

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