5

Mam obiekt o nazwie Delivery, który ma zestaw powiązanych obiektów z obiektami. Każdy obiekt dostawy przechowuje także mainCustomerId, który jest NSNumber*. Mam NSFetchedResultsController, który jest używany do zarządzania źródłem danych dla UITableView. Problem polega na tym, że chcę posortować NSFetchedResultsController przez pole lastName klienta (klient ponownie jest przechowywany w relacji wiele do wielu o nazwie customers na obiekcie Delivery), gdzie jeden z klientów w zestawie ma ID klienta równe MainCustomerId dostawy.Sortuj NSFetchedResultsController z obiektem w NSSet należącym do jednostki

dostawy klasy wygląda następująco (tylko odpowiednie części)

@interface Delivery : NSManagedObject 
@property (nonatomic, retain) NSNumber * mainCustomerId; 
@property (nonatomic, retain) NSSet *customers; 
@end 

Klasa klienta wygląda następująco

@interface Customer : NSManagedObject 
@property (nonatomic, retain) NSNumber * customerId; 
@property (nonatomic, retain) NSString * lastName; 
// And the inverse relationship to the deliveries 
@property (nonatomic, retain) NSSet *deliveries; 
@end 

muszę zrobić NSSortDescriptor że robi coś tak (uwaga, Wiem, że to niewłaściwy format i nie zadziała. Mam nadzieję, że komunikuje się z tym pomysłem.

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"customers.AnyobjectInSet.lastName WHERE AnyobjectInSet.customerId == masterCustomerId ascending:YES]; 

Próbowałem kilka rzeczy przy użyciu podkwerend i NSExpressions, ale zawsze pojawiają się krótkie, ponieważ nie mogę używać żadnych funkcji, które używają Cocoa (jak sortowanie z @selector), ponieważ musi być w stanie wygenerować prawdziwe zapytanie mysql bez przetwarzania kakao z dane. Ale czuję, że musi to być jakiś sposób, aby to zrobić, ponieważ byłoby to łatwe zapytanie w mysql.

select * from Delivery JOIN Customer ON Customer.customerId=Delivery.mainCustomerId ORDER BY Customer.lastName; 

Próbuję uniknąć konieczności sortowania po wyniki są naciągane i przechowywać porządek z powrotem na obiekt (co byłoby łatwe, ale czuję, że jest to złe rozwiązanie, ponieważ jestem wybierając odpowiednie dane Musi być sposób sortowania według tego). Każda pomoc będzie bardzo ceniona.

Z góry dziękuję.

+0

dlaczego nie można skorzystać z orzecznika, a następnie zastosować deskryptor sortowania. – Leena

+0

Dzięki Leena, nie jestem do końca pewien, w jaki sposób mogę użyć predykatu, aby rozwiązać ten problem. Nie filtruje moich wyników przez nic. Po prostu muszę zamówić je według obiektu klienta z odpowiednim identyfikatorem. Czy masz przykład tego, co masz na myśli? – johnrechd

+0

Skorzystaj z tego dokumentu: -http: //developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Predicates/predicates.html – Leena

Odpowiedz

2

Dobrze, więc może brakuje mi czegoś, ale sugestia predykatu ma dla mnie sens. Proszę mnie poprawić, jeśli się mylę, ale (zakładając, że wiesz mainCustomerID):

NSNumber *mainCustomerID = ... 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"customerID == %@", mainCustomerID]; 
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES]; 

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Customer"]; 
[request setPredicate:predicate]; 
[request setSortDescriptors:@[ sortDescriptor ]]; 

NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] initWithFetchRequest:request ... 

Więc w zasadzie, jeśli nie jest jasne, to pobrać wszystkie rekordy klienta, gdzie customerId jest równa mainCustomerID a następnie posortować te wyniki według lastName. To BĘDZIE wewnętrznie wygenerować instrukcję SQL, aby wykonać to za Ciebie.

Czy to nie jest to, co próbujesz zrobić?

Także jeśli chcesz zobaczyć SQL, który jest generowany przez CoreData przy starcie (przydatne narzędzie do debugowania), otwórz program i przejdź do zakładki „argumenty” i dodać następujące „argumentów przekazanych na uruchomienie”:

-com.apple.CoreData.SQLDebug 1 

Szczęśliwy Coding :)

+0

Dziękuję Shapps, nie do końca tym, co robię. Wyświetlam obiekty dostawy w komórkach i chcę je sortować według klienta w NSSet, który ma ten sam identyfikator, co wskazany główny klient. Gdzie zestaw klientów należy do podmiotu dostawy. Zasadniczo, muszę posortować określony obiekt w NSSet należącym do pobranej jednostki. Szczęśliwe kodowanie również. – johnrechd