2013-07-18 6 views
7

Hi pracuję na danych podstawowych z 3 jednostek (klasa, studentów, ExamRecord) i ich relacje obszar jako:tworzą orzecznika związku w CoreData xcode iphone

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

stworzyłem orzecznik na listę pobierania uczniowie klasy piątej.

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

z tym otrzymuję wszystkich uczniów klasy 5.

Teraz chcę też zastosować inny filtr Students naciągane.

Fetch studenci, których egzamin Record „Wynik” to „pass” .result jest atrybutem dla studenta w jednostce ExamResult

Jak mogę skorzystać z związku orzecznika w tym?

Proszę mnie poprawić jeśli się mylę

Każda pomoc będzie mile widziane

Dzięki

Odpowiedz

26

Można użyć predykatu związek:

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

Albo po prostu połączyć testy z "AND":

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

Należy zauważyć, że lista argumentów predicateWithFormat nie jest nil -terminowana. Liczba argumentów jest określona przez liczbę specyfikatorów formatów w formacie ciąg.

+0

@Fogmeister: Chciałbym wiedzieć. –

+0

@MartinR Dzięki za pomoc, ale nadal nie jestem w stanie pobrać wyniku dla Student.My predykat staje się: studentsToClass.className == "5th" AND studentsToExamRecord.result == "Pass" Pomóż mi i popraw mnie tam, gdzie jestem zły – sagar

+0

@sagar: Czy pojawia się błąd lub brak wyników? Być może pokaż, jak definiuje się obiekty i jak je tworzysz. Czy otrzymasz wszystkie obiekty, jeśli pominiesz predykat? –

0

Po pierwsze, twój cytowany predykat jest już naprawdę błędny. Powinieneś odwołać się do zarządzanego obiektu, a nie jego własności (tj. Nie do name z Class). Powinno być:

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

Należy również wybrać bardziej czytelne nazwy dla zmiennych i właściwości. Więc nie fmt2, ale formattingString. Nie studentsToClass, ale form ("klasa" jest specjalnym wyrazem w celu C). Masz pomysł.

więc pożądany związek orzecznik odbywa się tak (wersja krótka):

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

Skomplikowana wersja, jeśli naprawdę trzeba wyższy poziom abstrakcji (w co wątpię):

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

Jak dołączyć dwie subpredicaty do jednej, jeśli obie są opcjonalne, tj. A OR B, a nie A AND B. –

+0

To byłoby oddzielne pytanie SOF ;-). – Mundi

+0

Tak, znalazłem :) Wykonuje się to za pomocą orPredicateWithSubpredicates: –

2

Po pierwsze, nie powinieneś naprawdę wywoływać relacji student - class relacja studentsToClass. Nazwa relacji powinna odzwierciedlać, jaki typ obiektu znajduje się na drugim końcu.

E.g.

W tym przypadku stosunek do ClassStudent powinien być nazywany class ponieważ obiekt znajduje się pojedyncza Class podmiot. Relacja odwrotna nie powinna być wywoływana classToStudent powinna być nazywana students, ponieważ obiekt jest tam NSSet wielu Students.

EDIT

Wystarczy dodać do tego. Nazwa relacji powinna wyjaśniać DLACZEGO tam jest. Widzimy, że relacja jest od klasy do ucznia, ale jeśli nazwiesz ją "classToStudent", to niczego nie wyjaśni. Co jeśli masz drugą relację z klasy do studenta? Jak to nazywasz. Jeśli go nazwiesz attendees lub pupils lub attendingStudents itd., Daje to znaczenie relacji.

ROZWIĄZANIE

W tym przykładzie mam zamiar zadzwonić do nich jak bym do nich zadzwonić i widać, że sprawia, że ​​nieco łatwiej zrozumieć ...

Zresztą ...

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

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

Dzięki za pomoc Ale nadal nie mogę pobrać studenta.Mój predykat staje się: studentsToClass.className == "5th" AND studentsToExamRecord.result == "Pass" Poproś o pomoc i popraw mnie tam, gdzie się mylę – sagar