Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I properly annotate inheritance classes using ORMLite?

I'm trying to use inheritance with ORMLite and I can't work out if it is supported or not from looking at the documentation and googling.

What I want to do is have

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
}

What I can't work out (assuming it's supported) is how to annotate the 3 classes for ORMLite.

Do I only need to annotate the concrete classes with @DatabaseTable(tableName = "Student") or do I need the abstract class also?

I keep getting errors like:

04-24 10:18:30.857: E/AndroidRuntime(30495): Caused by: java.lang.RuntimeException: java.sql.SQLException: Unknown field 'name' from the Android sqlite cursor, not in:[year, school]

like image 226
Boonzie Avatar asked Apr 24 '12 00:04

Boonzie


2 Answers

The @DatabaseTable annotation is only necessary on the Student or Teacher tables and would not be used if it was on the Person base class.

What you need to have is a @DatabaseField annotation on the id and name fields in Person. For example:

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

ORMLite should walk the class hierarchy and any fields from the base class should be included in the Student and Teacher tables. If you edit your question to show the @DatabaseField or other annotations, I can comment more.

like image 94
Gray Avatar answered Oct 14 '22 02:10

Gray


Ok for that but now, how to implements, in that example, a fourth class containing a List<AbstractPerson> ?

I precise my question :

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

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

because when ormlite will try to access peoples like :

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

It won't be able to get personDAO because it doesn't exist (abstract)... I get all my database functionnal with good Id's and relation, it's just a data access question ?

like image 22
Bourdier Jonathan Avatar answered Oct 14 '22 04:10

Bourdier Jonathan