会议室数据库处理POJO和多个表中的继承

时间:2019-01-30 10:53:01

标签: android-sqlite database-migration android-room

从sqlite迁移到Room时遇到问题。我有1个父类和1个子类以及2个与之对应的表。

我的继承如下

public class Sms {
    int _id;
    String sender;
    String body;
    Date date;
} 

public class Event extends Sms {
    String eventName;
    long eventDueDate;
}

我的表为

SmsTable >>  
_id INTEGER NOT NULL primary key autoincrement,
sender TEXT not null,
body TEXT not null,
date INTEGER not null

EventTable >>
_id INTEGER NOT NULL primary key autoincrement,
sms_id INTEGER,
eventName TEXT not null,
eventDueDate INTEGER

现在,当我将Event定义为@Entity(tableName =“ EventTable”)时,它给我一个错误,即Migration无法按预期的TableInfo正确处理事件,并且发现TableInfo不匹配。

“期望的表信息”具有发件人,正文,日期列,而我的EventTable没有这些列。

如何迁移已继承自Sms但表未展平的Event类?

P.s。我无法将EventTable展平,因为即使没有事件,SmsTable仍然存在,我也需要将Sms转换为Entity。

1 个答案:

答案 0 :(得分:1)

IgnoredColumns :如果实体从父实体继承字段,通常更容易使用@Entity属性的ignoredColumns属性。

foreignKeys :即使您不能使用直接关系,Room仍允许您定义实体之间的外键约束。

@Entity(tableName = "EventTable", ignoredColumns = "sender","body","date",
       foreignKeys = @ForeignKey(entity = Sms.class,
        parentColumns = "id" , childColumns = "sms_id"))

        public class Event extends Sms {

        @PrimaryKey(autoGenerate = true)
        @ColumnInfo(name = "_id")
         public int id;

         @ColumnInfo(name = "sms_id")
          public int smsId;

         public String evwntName;
         public long eventDuedate;

    }