2015-06-30 13 views
17

Czy ktoś wie, czy możliwe jest utworzenie tabeli dla klasy abstrakcyjnej w ActiveAndroid. Na przykład mógłbym stworzyć abstrakcyjną klasę Animal z dwoma konkretnymi klasami Dog and Cat. Chcę być w stanie zrobić coś takiego:ActiveAndroid klasa abstrakcyjna tabela

List<Animal> animals = new Select().from(Animals.class).execute(); 

co skutkowałoby „zwierzęta” zawierający wszystkie zapisane kotów i psów. Lub:

Animal animal = new Select().from(Animals.class).where("name = ?", name).executeSingle(); 

Gdzie „zwierzę” może być albo kot lub pies. Niestety, gdy to zrobię, otrzymuję wyjątek, ponieważ dla klasy abstrakcyjnej Animal nie jest tworzony żaden stół. Czy ktoś wie, jak mogę to zrobić za pomocą ActiveAndroid?

+1

Nie można użyć klasy bazowej zamiast abstrakcji? –

+0

Nie jestem całkiem pewien, czy rozumiem, dlaczego chcesz to zrobić w ten sposób? Celem klasy abstrakcyjnej jest użycie klasy potomnej, takiej jak "Kot" lub "Pies". Uwaga: Tworzysz obiekt "Zwierzęce zwierze", którego nie można zrobić w Javie, jednak twoja lista przed rozdaniem może być wykonana, ale będziesz musiał rzucić do odpowiedniej podklasy przed rozpoczęciem pracy z obiektem. –

+0

Nie będę tworzyć abstrakcyjnego "Animal" w powyższym przykładzie. Chciałbym, aby ActiveAndroid zbudował kota lub psa, w zależności od typu obiektu, który został pierwotnie zapisany. – user3265561

Odpowiedz

1

Niestety ActiveAndroid nie obsługuje jeszcze dziedziczenia modeli w ten sposób (https://github.com/pardom/ActiveAndroid/issues/14, https://github.com/pardom/ActiveAndroid/issues/257).

Jeśli chcesz zmodyfikować ActiveAndroid oto co można zrobić:

  • Tworzenie jakąś adnotacji, który pozwala zdefiniować model (Animals) jako coś, co nie jest zachowywane (patrz com.activeandroid.annotation.Table).
  • Podczas próby wykonania kwerend dla tej klasy można użyć odbicia, aby określić jego klasy podrzędne, a następnie zlecić to zapytanie dla każdej klasy podrzędnej.
  • Następnie należy zasadniczo wziąć listę wyników dla każdego zapytania i połączyć je w jedną listę i zwrócić.

Szczerze mówiąc, nigdy nie widziałem dziedzictwa w żadnych bibliotekach ORM Androida i osobiście uważam, że nie jest to dobry wzór dla modeli. Możesz zastanowić się nad swoim rozumowaniem, aby pójść tą drogą.

+0

Co byś polecił dla dziedziczenia, gdy utrzymujesz moje klasy modelu? Chcę móc zapisać "prace", które mogą być różnymi rodzajami "pracy". Czy lepiej byłoby mieć oddzielną tabelę dla każdego rodzaju pracy, a następnie tabelę "wzorcową", która zapisywała typ zadania i klucz obcy w odpowiedniej tabeli dla tego typu pracy? – user3265561

+1

@ user3265561 Co mogę zrobić, to stworzyć model pracy w bardzo ogólny sposób. Kolumny to JobType i inne właściwości wspólne dla wszystkich zadań. Miałaby również kolumnę AdditionalProperties, która byłaby ciągiem zawierającym zserializowany obiekt JSONObject z dowolnymi innymi właściwościami specyficznymi dla zadania. – nyx

+0

W ten sposób mogłem mieć ogólne "zadanie", które zostałoby zapisane w bazie danych, wtedy każda z podklas "RealJob" mogłaby zastąpić funkcję "serializeAdditionalProperties()", która zwróciłaby json wymaganą do odbudowania tego obiektu, gdy byłaby deserialized w przyszłości. – user3265561

Powiązane problemy