2013-07-18 38 views
7

HI我對核心數據正與3個實體(課上,學生,ExamRecord)和他們的關係面積:創建coreData xcode的iphone一個複合謂語

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

我創建了一個謂語爲獲取列表第五班的學生。

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

這個我得到第5類

的所有學生現在我也想申請上取出的學生另一個過濾器。

取的學生,其考試記錄「結果」是「通行證」。結果是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 help and correct me where I am wrong – sagar

+0

@sagar:你得到一個錯誤或沒有結果?也許顯示實體是如何定義的以及如何創建對象。如果你省略謂詞,你會得到所有的對象嗎? –

0

首先,您所引用的謂詞確實已經是錯誤的。您應該引用管理對象,而不是其屬性(即不是Classname)。它應該是:

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

此外,你應該真的爲你的變量和屬性選擇更可讀的名稱。所以,不是fmt2而是formattingString。不是studentsToClass,而是form(「class」是Objective-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

如何將兩個子選擇符合併爲一個,如果它們都是可選的,即A或B而不是A和B. –

+0

這是一個單獨的SOF問題;-) – Mundi

+0

是的,我發現:)它使用orPredicateWithSubpredicates完成: –

2

首先,你不應該真的叫student - class關係studentsToClass。關係的名稱應該反映在另一端是什麼類型的對象。

E.g.

在這種情況下,Student關係Class應該叫class因爲對象有一個單一的實體Class。 反函數不應該被稱爲classToStudent它應該被稱爲students,因爲這個對象有多個StudentsNSSet

編輯

我想補充這一點。關係的名稱應解釋爲什麼它在那裏。我們可以看到,這個關係是從一個班級到另一個班級的學生,但是如果你把它稱爲「classToStudent」,它不會解釋任何事情。另外,如果你有班級與學生之間的第二個關係呢?你叫什麼?如果你叫它attendeespupilsattendingStudents等。它給出了關係的含義。

SOLUTION

在這個例子中,我會打電話給他們,我會怎麼稱呼他們,你會看到它使得它更容易一點理解......

反正...

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 ==「5th」 AND studentsToExamRecord.result ==「通過」PLease幫助並糾正我錯在哪裏 – sagar