Java 带子类的房间

Java 带子类的房间,java,android,android-room,Java,Android,Android Room,我希望持久化一些数据类。我一直在研究如何使用Room,如果它只是一个独立的数据类,这是非常直接的。然而,我试图持久化的对象是子类,这增加了一层复杂性 此代码尚未编译,因此仅用于说明。 因此,使用一个简单的直接类 @Entity(tableName = TABLE_NAME) public class Event implements MyEvent { public static final String TABLE_NAME = "events"; public st

我希望持久化一些数据类。我一直在研究如何使用Room,如果它只是一个独立的数据类,这是非常直接的。然而,我试图持久化的对象是子类,这增加了一层复杂性

此代码尚未编译,因此仅用于说明。

因此,使用一个简单的直接类

    @Entity(tableName = TABLE_NAME)
   public class Event implements MyEvent {
   public static final String TABLE_NAME = "events";
   public static final String DATE_FIELD = "date";

   @PrimaryKey(autoGenerate = true)
   private int id;
   private String name;
   private String description;
   @ColumnInfo(name = DATE_FIELD)
   private LocalDateTime date;

   public Event(int id, String name, String description, LocalDateTime date) {
       this.id = id;
       this.name = name;
       this.description = description;
       this.date = date;
   }

   @Override
   public int getId() {
       return id;
   }

   @Override
   public String getName() {
       return name;
   }

   @Override
   public String getDescription() {
       return description;
   }

   @Override
   public LocalDateTime getDate() {
       return date;
   }

   @Override
   public String toString() {
       return "Event{" +
               "id=" + id +
               ", name='" + name + '\'' +
               ", description='" + description + '\'' +
               ", date=" + date +
               '}';
   }

   public long getDaysUntil() {
       return ChronoUnit.DAYS.between(LocalDateTime.now(), getDate());
   }
}
这是直截了当的,但如果你有

  public class MusicEvent extends Event implements MyEvents {

  private String musicType;
  private boolean supportActs;

   @Override
   public int getId() {
      return id;
   }

   @Override
   public String getName() {
       return name;
   }

   @Override
   public String getDescription() {
       return description;
   }

   @Override
   public LocalDateTime getDate() {
       return date;
   }

  public void setMusicType(String musicType) {
      this.musicType = musicType;
  }

  public String getMusicType() {
      return this.musicType;
  }

  public void setSupportActs(boolean supportActs) {
      this.supportActs = supportActs;
  }

    public boolean getSupportActs() {
      return this.supportActs;
  }
  }

  public interface MyEvents {
     int getId();
     String getName();
     String getDescription();
     LocalDate getDate();
  }

所以我想做的是有一个事件表,我不想有多个事件表,例如音乐事件、电影事件、戏剧事件

或者,如果它们都实现MyEvents,那么它们都可以是MyEvents类型

我希望能够持久化所有事件对象,并在需要时检索所有事件对象


如果有人能分享一些这方面的信息,我将不胜感激。

“我不想为音乐活动、电影活动、戏剧活动等设置多个表”--继承在任何ORM中都很难建模。好吧,Room不处理继承(即,有一些列指示使用哪个类从行创建实体),也不处理包含所有子类中所有可能列的实体表的概念。有可能另一个安卓ORM可以处理这些事情。更可能的情况是,您需要放松您的需求或切换到更像对象数据库的东西(例如,领域),这可能会更好地建模。@Commonware非常感谢您回到我身边,从我的研究和实验中我也非常害怕。看来我可能会制定一个不同的方法!Android的JDXA ORM可以很好地处理类继承。您可以将Event和MyEvent对象保存在单独的表中或同一个表中。默认情况下,对超类的查询还检索子类的限定对象(多态性)。但是,可以将选择仅限于超类对象。免责声明:我是JDXA ORM的架构师。有关于这方面的进一步信息吗?我处于相似的情况下,仍然在思考是否有可能为相似的对象使用一个DAO,例如,为子类的所有对象使用一个insert方法