2009-10-16 7 views
6

Mam potrzebę utworzenia złożonego predykatu dla abstrakcyjnego obiektu podstawowego. Chcę mieć oddzielne kwerendy predykatów dla różnych dziedziczących encji i wyłączyć typ podelementu, poniższy przykład jest tym, co chciałbym zrobić, jednak nie byłem w stanie znaleźć sposobu na odniesienie nazwy lub typu jednostki predykat.W jaki sposób można odwoływać się do nazwy jednostki podrzędnej w predykacie dla żądania pobrania jednostki nadrzędnej?

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
request.entity = [NSEntityDescription entityForName:@"MyCommonObjectBase" inManagedObjectContext:myContext]; 

NSPredicate *subclassAPredicate = [NSPredicate predicateWithFormat:@"someValue > %@ && entityName = %@", 100, @"SubclassA"]; 
NSPredicate *subclassBPredicate = [NSPredicate predicateWithFormat:@"someValue < %@ && entityName = %@", 50, @"SubclassB"]; 

request.predicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:subclassAPredicate, subclassBPredicate, nil]]; 

Odpowiedz

10

Dostałem odpowiedź od firmy Apple na numer http://bugreport.apple.com problemu 7318897:

entity.name nie jest wzorowana własność, więc nie jest to legalne. działa przypadkowo w sklepie binarnym. Prawidłowy sposób pobierania subdelementów polega na wykonaniu polecenia NSFetchRequest i użyciu wartości setIncludesSubentities.

Wydaje się, że właściwym rozwiązaniem jest posiadanie oddzielnych żądań pobierania i scalanie zestawów wyników po wykonaniu.

+0

Więc to, co mówisz, to mój problem nie ma rozwiązania, a nie najpierw pobrać wynik, a następnie zastosować predykaty reszty na wynik w ręku? http://stackoverflow.com/questions/11934763/nspredicate-on-nested-object-nsset-to-filter-the-result-during-nsfetchrequest – yunas

+0

Niestety tak. –

3

Strzał w ciemności tutaj, ale co z wykorzystaniem wartości className w orzecznika?

NSPredicate *subclassAPredicate = [NSPredicate predicateWithFormat:@"someValue > %d AND child.className = %@", 100, @"SubclassA"]; 

(Zauważ, że wystąpił błąd w formacie kwantyfikatorów. Uzywasz %@ spróbować substytut w wartości całkowitej (100). %@ służy wyłącznie do obiektów. Użyj %d (lub jakiś inny smak) dla prymitywów)

EDYCJA ZNOWU!

będziemy chcieli to zrobić:

NSPredice * p = [NSPredicate predicateWithFormat:@"entity.name = %@", @"SubclassA"]; 

Właśnie to przetestowane na jednej z moich aplikacji i wydaje się działać.

-Another Edit-

Oto test, który wpadłem, co wydawało się do pracy:

NSManagedObjectContext * c = [self managedObjectContext]; 
NSFetchRequest * f = [[NSFetchRequest alloc] init]; 
[f setEntity:[NSEntityDescription entityForName:@"AbstractFolder" inManagedObjectContext:c]]; 
[f setPredicate:[NSPredicate predicateWithFormat:@"entity.name = %@", @"DefaultFolder"]]; 
NSError * e = nil; 
NSArray * a = [c executeFetchRequest:f error:&e]; 
[f release]; 
NSLog(@"%@", a); 

Kiedy biegnę, że a kłody dwa NSManagedObjects, obie odmiany @"DefaultFolder" (co jest co Spodziewałem się). (AbstractFolder jest abstrakcyjna jednostka Jedną z jednostek podrzędnych, które dziedziczy to DefaultFolder).

+0

Dam ci ten strzał, dziękuję. Tak, to literówka z generalizowania kodu produkcyjnego w celu ilustracji. –

+0

Bez powodzenia, className nie jest prawidłową keypath. Poza tym szukam nazwy podmiotu self, a nie jednostki dziecięcej, tylko po to, by wyjaśnić. –

+1

@Greg Znalazłem sposób, który działa i edytowałem moją odpowiedź. –

-1

Jedynym sposobem kojarzenia orzecznik z podmiotem znam jak to:

NSPredicate * predicate = [NSPredicate predicateWithFormat: @"(%K == %@)", fieldName, fieldValue, nil]; 
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext]]; 
[request setPredicate:predicate]; 

Może odnosili się do nazwy pola?

Edytuj: encja jest powiązana z żądaniem, a nie z predykatem.

Powiązane problemy