2012-06-14 30 views
9

Korzystanie z podstawowych danych Chciałbym pobrać niektóre dane. Mój model wykorzystuje pewne abstrakcyjne elementy, patrz załączony obrazek, gdzie QuantifiedIngredient jest klasą abstrakcyjną. Chciałbym pobrać elementy Ingredient, które mają co najmniej jeden RecipeQuantifiedIngredients, ale w środku QuantifiedIngredient, który jest klasą abstrakcyjną.Jak mogę poznać typ klasy abstrakcyjnej jednostki w NSPredicate?

Jak mogę to zrobić, w jaki sposób mogę przetestować rzeczywisty typ abstrakcyjnej klasy w NSPredicate? Masz pomysł lub sugestię?

enter image description here

Jedyną wskazówką znalazłem: How can you reference child entity name in a predicate for a fetch request of the parent entity?

będzie działać właściwość niestandardową w moim QuantifiedIngredient wiedzieć, czy jest to RecipeQuantifiedIngredient? Na przykład isRecipeQuantifiedIngredient?

Bardzo dziękuję za pomoc.

Odpowiedz

1

Nie chcę tracić czasu tłumaczyć to pod CoreData-speak więc tutaj jest moja myśl w SQL:

SELECT * FROM quantifiedIngredients WHERE recipe <> NULL 

lub coś podobnego. Jest to w gruncie rzeczy sugestia Nikity użycia flagi, z tym że "flagą" jest istnienie własności. Nie wiem, jak zareaguje CoreData w obliczu GroceryQuantifiedIngredients, które nie mają recipe, myślę, że KVO rzuci wyjątek. Może być tak śmiały, aby dodać kategorię:

@interface GroceryQuantifiedIngredients (KVOHack) 
-(id)recipe; 
@end 

@implementation GroceryQuantifiedIngredients (KVOHack) 
-(id) recipe { return nil; } 
@end 

To oczywiście wymaga CoreData wyliczyć wszystkie quantifiedIngredients, ale przypuszczam, będzie musiał zrobić tak i tak, i A return nil należy zoptymalizować pod maleńkim kodu. Drugą kwestią jest to, czy będzie to miało zły wpływ na resztę kodu; będziesz musiał wykonać to połączenie.

Innym pomysłem, który pojawia się myśl, jak skończę to się jest zrobić coś takiego (Dostaję naprawdę luźno z mojego pseudo-kod teraz):

SELECT * FROM quantifiedIngredients WHERE [i respondsToSelector:@selector(recipe)]; 

Zobacz, co mam na myśli? Zapomniałem, czy CoreData pozwala ci grać z jakimś kursorem podczas pracy z predykatami lub przynoszonymi Thingamabobbers, jeśli to robi, niż myślę, że to jest twój najlepszy zakład. W każdym razie jest niedzielne popołudnie, więc rzeczy są pozostawione jako ćwiczenie dla czytelnika.

+1 za dobre pytanie.

+0

Problem polega na tym, że SQL używa modelu relacji między jednostkami, w którym nie ma relacji dziedziczenia lub wiele-do-wielu. Tak więc praca na poziomie SQL nie ma sensu, ponieważ Core Data używa modelu obiektowego (z dziedziczeniem i relacjami wiele do wielu).Więc, jak mówisz, jest to jak tworzenie programu w C++ i wprowadzanie pewnych modyfikacji w asemblerze (oczywiście nie tak ciężkim). – Ricardo

+0

To, co mówisz o respondsToSelector, jest tym, czego szukam, wygląda na to, że jest coś, co nazywa się className, ale nie działa z SQL perstistent store, jednak działa z innymi. To ciekawe. Oprócz klasy class czy respondsToSelector, a co z castingiem? Wysłałem wiadomość e-mail do Apple tydzień temu, a oni powiedzieli mi, że muszą się o tym dowiedzieć (to płatne pytanie). – Ricardo

+0

Nie masz odpowiedzi, ale to, co powiedziałeś, jest bardzo interesujące. Wielkie dzięki. – Ricardo

2

Jeśli wymagana jest recipe w RecipeQuantifiedIngredient, można spróbować wykonać pobieranie, które sprawdza, jeśli istnieje jakakolwiek ingredient.recipe. Myślę, że to zadziała.

Własność własna, w rodzaju flagi, będzie działać również dla Ciebie. Będziesz po prostu musiał ustawić i usunąć to ustawienie, gdy dodasz lub usuniesz wszystkie recipeQuantifiedIngredient.

+0

Rzeczywiste pytanie, czy można poradzić sobie z dziedziczeniem z NSPredicate. Myślałem już o dodaniu flagi, ale z punktu widzenia modelowania jest to nieprzyjemne rozwiązanie, chociaż mogłoby to obejść. Dzięki i tak. – Ricardo

Powiązane problemy