在核心Data xcode iphone中创建复合谓词

时间:2013-07-18 12:54:58

标签: iphone ios core-data nspredicate

我正在研究核心数据,包括3个实体(班级,学生,考试记录)及其关系区域:

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

我创建了一个谓词,用于获取第5课的学生列表。

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

这样我就得到了第5班的所有学生

现在我还想在提取的学生上应用另一个过滤器。

获取考试记录“结果”为“通过”的学生.result是ExamResult实体中学生的属性

如何在此使用复合谓词?

如果我错了,请纠正我

任何帮助将不胜感激

由于

4 个答案:

答案 0 :(得分:29)

您可以使用复合谓词:

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 - 已终止。 参数的数量由格式中格式说明符的数量决定 字符串。

答案 1 :(得分:2)

首先,您不应该真正调用student - class关系studentsToClass。关系的名称应反映另一端的对象类型。

E.g。

在这种情况下,与Student的{​​{1}}关系应称为Class,因为该对象只有一个class实体。 不应将反向关系称为Class它应该被称为classToStudent,因为该对象有students多个NSSet

修改

只是添加到此。关系的名称应该解释为什么它存在。我们可以看到关系是从班级到学生,但如果你称之为“classToStudent”,它就不会解释任何事情。另外,如果你有从班级到学生的第二关系怎么办?你怎么称呼它。如果您将其称为Studentsattendeespupils等,则会给出关系含义。

<强>解

在这个例子中,我将打电话给他们如何称呼它们,你会发现它让它更容易理解......

总之...

attendingStudents

答案 2 :(得分:0)

首先,你引用的谓词确实已经错了。您应该引用托管对象,而不是其属性(即不是name的{​​{1}})。它应该是:

Class

此外,您应该为变量和属性选择更易读的名称。所以,不是[NSPredicate predicateWithFormat:@"class = %@", classObject]; 而是fmt2。不是formattingString而是studentsToClass(“class”是Objective-C中的特殊字)。你明白了。

所以你想要的复合谓词是这样的(短版本):

form

复杂的版本,如果你真的需要更高级别的抽象(我怀疑):

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

答案 3 :(得分:0)

谓词也可以使用复合谓词嵌套(对于 Swift

        let orPredicate = NSCompoundPredicate(type: .or, subpredicates: [date_1KeyPredicate, date_2KeyPredicate])

        let functionKeyPredicate = NSPredicate(format: "function_name = %@", self.title!)

        let andPredicate = NSCompoundPredicate(type: .and, subpredicates: [orPredicate, functionKeyPredicate])