2013-01-03 15 views
5

Zacząłem programować aplikację na iPhone'a za pomocą CoreData i próbując uczynić mój kod tak dobrze, jak to tylko możliwe. Dlatego chciałbym, aby uniknąć twardego zakodowane ciągi takie jak:Nazwa atrybutu NSPredicate CoreData

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", aName]; 

Zamiast Chciałbym móc napisać coś takiego:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", Person.name, aName]; 

ten sposób chciałbym uzyskać kompilator, by sprawdzić, czy name jest własnością podmiotu Person i unika błędów w pisowni.

Z tym kodem chociaż ja otrzymuję następujący błąd podczas kompilacji: Property name nie stwierdzono na obiekcie typu Person

Person jest typu NSManagedObject i automatycznie generowanego przez Xcode z mojego MyApp.xcdatamodeld.

name jest prosty atrybut ciąg podmiotu Person

Mam google i SOed się sporo już na odpowiedź do tej konkretnej kwestii. Próbowałem również używać property_getName i NSPropertyDescription przy braku szczęścia do tej pory.

Z góry dziękuję za pomoc,

Joss.

+0

To nie działa w ten sposób, nadal trzeba podać '@" name "do argumentu' @ K'. – Joe

Odpowiedz

4

Jeśli używasz Mogenerator, za doskonałą propozycją Kendalla, w klasach generowanych automatycznie dostaniesz trzy struct s zadeklarowane w nagłówku - EntityNameAttributes, EntityNameRelationships i EntityNameFetchedProperties. Na przykład, jeśli Twoja jednostka nazywa się Person i ma atrybut name, możesz uzyskać dostęp do klucza za pomocą PersonAttributes.name. Umożliwi to uniknięcie zakodowanych na stałe nazw kluczy w kodzie aplikacji.

+0

Nie wiedziałem, że został uwzględniony w domyślnych szablonach.To jest sposób, aby przejść na pewno. Świetna odpowiedź! Joss, powinieneś zaakceptować tę odpowiedź (kliknij kontur znaczka po lewej i oznacz go jako zaakceptowany). –

+0

@KendallHelmstetterGelner dziękuję !! –

+0

@CarlVeazey: Wspaniała odpowiedź! Dokładnie to, czego szukałem. To było moje pierwsze pytanie na SO, naprawdę szczęśliwe! – Joss

4

Po pierwsze, Person.name nie istnieje, ponieważ "nazwa" jest własnością instancji osoby, a nie klasy.

Nie jestem pewien, czy istnieje naprawdę czytelna ścieżka od nazwy metody sprawdzanej przez kompilator do łańcucha znaków. Zawsze możesz użyć metod niższego poziomu, aby uzyskać dostęp do sygnatur metody z klasy i uzyskać od nich łańcuchy, ale punktem wyjścia dla nich jest niezaznaczony ciąg (C lub ObjC).

Ogólne użycie predykatów spowoduje błędy, jeśli otrzymasz błędną nazwę, więc każde testowanie, które używa predykatu, potwierdzi, że nazwa metody jest poprawna.

Powinieneś używać Mogeneratora do generowania obiektów danych do użytku z twoim modelem. W takim przypadku możesz przyjrzeć się zmianie szablonów, aby dodać metodę o nazwie "stringForMethodNamed * Name *" i uwzględnić ją jako jeden z parametrów sformatowanego predykatu.

+0

Dziękujemy za wyczerpującą odpowiedź Kendall! Właśnie słyszałem o Mogenerator dzisiaj ;-). Sądzę, że nadszedł czas, aby w to zagłębić się. Chciałbym móc głosować na twoją odpowiedź. Jestem noobem na SO i nie mam wystarczającej reputacji. – Joss

+0

Bez obaw, jeśli zaakceptujesz odpowiedź, zyskasz reputację. –

Powiązane problemy