2012-04-24 4 views
6

Ich versuche, die Vererbung mit ORMLite zu verwenden, und ich kann nicht herausfinden, ob es von der Dokumentation und dem Googling unterstützt wird oder nicht.Wie ordne ich Vererbungsklassen ordnungsgemäß mit ORMLite an?

Was ich tun möchte, ist

public abstract class Person{ 
    public int id; 
    public String name; 
} 

public class Student extends Person{ 
    public String school; 
    public String year; 
    // other student stuff 
} 

public class Teacher extends Person{ 
    public String title; 
    // other teacher stuff 
} 

Was habe ich nicht herausfinden kann (vorausgesetzt, es wird unterstützt) ist, wie die drei Klassen für ORMLite zu annotieren.

Muss ich nur die Betonklassen mit @DatabaseTable(tableName = "Student") annotieren oder benötige ich auch die abstrakte Klasse?

Ich erhalte immer Fehler wie:

04-24 10: 18: 30,857: E/Android Runtime (30495): Verursacht durch: java.lang.RuntimeException: java.sql.SQLException: Unbekanntes Feld ' Name‘aus den Android sQLite-Cursor, nicht in: [Jahr, Schul]

Antwort

7

die @DatabaseTable Anmerkung ist nur notwendig, auf den Student oder Teacher Tabellen und würde nicht verwendet werden, wenn es auf der Person Basisklasse ist.

Was Sie haben müssen, ist eine @DatabaseField Annotation auf die id und name Felder in Person. Zum Beispiel:

public abstract class Person{ 
    @DatabaseField(generatedId = true) 
    public int id; 
    @DatabaseField 
    public String name; 
} 

ORMLite sollte die Klassenhierarchie und alle Felder von der Basisklasse gehen sollten in den Student und Teacher Tabellen enthalten sein. Wenn Sie Ihre Frage bearbeiten, um die @DatabaseField oder andere Anmerkungen anzuzeigen, kann ich mehr kommentieren.

+0

Danke, das beantwortete meine Frage auch, ob ORMLite für dieses Szenario funktionieren würde. – srowley

1

Ok für das aber jetzt, wie in diesem Beispiel eine vierte Klasse implementiert, die eine List<AbstractPerson> enthält?

ich genau meine Frage:

public class ClassRoom { 
    @ForeignCollectionField(foreignFieldName="asYouWant") 
    public Collection<Person> peoples; 
} 

peoples.add(new Student()); 
peoples.add(new Teacher()); 
peoples.add(new Student()); 

denn wenn ormlite versuchen, wie Völker zuzugreifen:

for (Person person : classRoom.peoples) 
{ 
    if (person.getType() == Student) 
     //do stuff 
    else if (person.getType() == Student) 
     //do other stuff 
} 

Es wird nicht möglich sein PersonDao zu bekommen, weil es nicht existiert (Zusammenfassung) ... Ich bekomme alle meine Datenbank funktional mit guten IDs und Beziehung, es ist nur eine Datenzugriffsfrage?

Verwandte Themen