2015-06-30 22 views
17

Qualcuno sa se è possibile creare una tabella per una classe astratta in ActiveAndroid. Per esempio potrei avere un animale di classe astratta con due classi di cani e gatti. Voglio essere in grado di fare qualcosa di simile:Tabella classe astratta ActiveAndroid

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

che si tradurrebbe in 'animali' contenente tutti i cani e gatti salvati. Oppure:

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

Dove 'animale' potrebbe essere o un gatto o un cane. Sfortunatamente quando faccio questo ottengo un'eccezione perché non viene creata alcuna tabella per la classe astratta Animale. Qualcuno sa come potrei fare questo usando ActiveAndroid?

+1

Non è possibile utilizzare una classe base anziché l'astrazione? –

+0

Non sono abbastanza sicuro di capire perché vuoi farlo in questo modo? L'intero scopo di una classe Abstract è che devi usare la classe child, come 'Cat' o' Dog'. Nota come stai creando un oggetto 'Animale animale', che non può essere fatto in Java, tuttavia la tua lista può essere fatta prima, anche se dovrai eseguire il cast nella sottoclasse appropriata prima di lavorare con l'oggetto. –

+0

Nell'esempio sopra non creerò un 'animale' astratto. Vorrei che ActiveAndroid costruisca un gatto o un cane a seconda del tipo dell'oggetto al momento del salvataggio originale. – user3265561

risposta

1

Sfortunatamente ActiveAndroid non supporta ancora l'ereditarietà dei modelli (https://github.com/pardom/ActiveAndroid/issues/14, https://github.com/pardom/ActiveAndroid/issues/257).

Se si voleva modificare ActiveAndroid ecco cosa si potrebbe fare:

  • creare una sorta di annotazioni che consente di definire un modello (Animals) come qualcosa che non viene mantenuto (vedi com.activeandroid.annotation.Table).
  • Quando si tenta di eseguire query per quella classe, è possibile utilizzare reflection per determinarne le classi figlio e quindi eseguire la query per classe figlio.
  • Quindi, in pratica, devi prendere l'elenco dei risultati per ogni query e combinarli in un unico elenco e restituirlo.

A dire il vero, non ho mai visto l'ereditarietà in nessuna libreria di ORM Android e personalmente non penso che sia un buon modello di progettazione per i modelli. Potresti voler riconsiderare il tuo ragionamento per seguire questa strada.

+0

Cosa consiglieresti sull'ereditarietà quando si mantengono le mie classi modello? Voglio essere in grado di salvare "lavori" che possono essere diversi tipi di "lavoro". Sarebbe meglio avere una tabella separata per tipo di lavoro, quindi una tabella "master" che memorizzasse il tipo di lavoro e la chiave esterna nella tabella corretta per quel tipo di lavoro? – user3265561

+1

@ user3265561 Quello che vorrei fare è creare il modello di lavoro in un modo molto generico. Le colonne dovrebbero essere JobType e qualsiasi altra proprietà abbia in comune tutti i lavori. Avrebbe anche una colonna AdditionalProperties che sarebbe una stringa che contiene un JSONObject serializzato di qualsiasi altra proprietà specifica del lavoro. – nyx

+0

In questo modo potrei avere un "Job" generico che verrebbe salvato nel db, quindi ogni sottoclasse "RealJob" potrebbe sovrascrivere una funzione "serializeAdditionalProperties()" che restituirebbe il json richiesto per ricostruire quell'oggetto quando è stato deserializzato in futuro. – user3265561