База данных помещений обрабатывает наследование в POJO и нескольких таблицах - PullRequest
0 голосов
/ 30 января 2019

У меня проблема при переходе с 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"), этовыдает ошибку, что миграция неправильно обработала события, как ожидалось, TableInfo и обнаружила, что TableInfo не совпадает.

Ожидаемая информация таблицы содержит столбцы для отправителя, тела, даты, в то время как в моей EventTable их нет.

Как перенести класс Event, унаследованный от Sms, но таблицы не сплющены?

Ps Я не могу расплющить EventTable, так как SmsTable существует даже без Event, и мне нужно также конвертировать Sms в Entity.

1 Ответ

0 голосов
/ 30 января 2019

IgnoredColumns : В тех случаях, когда объект наследует поля от родительского объекта, обычно проще использовать свойство ignoredColumns атрибута @Entity.

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;

    }
...