【问题标题】:Entity inheritance in android roomandroid房间中的实体继承
【发布时间】:2019-05-07 16:32:19
【问题描述】:

我有一个父类 Queue,它有以下字段:

  1. 姓名
  2. 类型
  3. 状态

根据类型,我将 Queue 分解为更多的子类,每个子类都有自己的额外字段。例如:

ProductionQueue extends Queue { startDate, endDate }
ShippingQueue extends Queue { shippingDate, shippingAgent }
...

我在 android studio 中创建了 Queue 作为基类并从中扩展了我的子类,但代码无法编译并抱怨缺少字段(子类字段)。这是一个例子:

@Entity(tableName = "queue")
public class Queue {
  int id;
  String name;
  int type;
  int status;
}

@Entity
public class ProductionQueue extends Queue {
  String startDate;
  String endDate
}

@Dao
public interface ProductionQueueDao extends BaseDao<ProductionQueue> {
    @Query("SELECT * FROM queue WHERE id = :queueID")
    LiveData<List<ProductionQueue>> findByID(Long queueID);
}

编译时我收到:错误:查询返回的列在 com.example.room.ProductionQueue 中没有字段 [startDate, endDate],即使它们被注释为非空或原始。查询返回的列:[id,name,type,status]。

[id,name,type,status] 来自父类,而[startDate, endDate] 是子类字段。

在我的应用程序中的各种情况下,我只会列出队列名称、类型和状态,并且我希望将队列数据保存在一个表中以便快速查询。

我可以为各个子类创建子表并使用关系,但如果 R​​oom 允许继承,所有这些都可以轻松避免。房间是否支持这种继承,如果是,我怎样才能让它工作?

谢谢。

【问题讨论】:

    标签: android android-room


    【解决方案1】:

    问题是您正试图从表 queue 中检索生产队列,该表不包含生产队列所需的日期信息。

    要解决这个问题,请为生产队列表定义一个名称:

    @Entity(tableName = "production_queue")
    public class ProductionQueue extends Queue {
        ...
    }
    

    然后,更改您的查询以从正确的表中检索行:

    // Retrieving rows from "production_queue", not from "queue"
    @Query("SELECT * FROM production_queue WHERE id = :queueID")
    LiveData<List<ProductionQueue>> findByID(Long queueID);
    

    这样,返回的行将包括字段startDateendDate

    【讨论】:

    • 这是否意味着每个子类都有自己的数据以及父表中的镜像记录?我想避免使用子表,因为大多数情况下我只会使用父类数据字段。
    • 不,它没有。您将只有在保存它们的表中保存的行;除非您创建它们,否则不会有任何镜像记录。如果您一次只处理几个字段,那么您可以使用子实体并在必要时将SELECT * 替换为SELECT id, name, type, status
    • 所以我不必将 Queue 类设为实体,而可以将其用作抽象类?为了一起查询所有队列子类,我应该创建一个额外的 Dao 类,它可以查询所有子表并连接它们的结果,还是有更好的方法?
    • 说实话,我不知道。这取决于您到底想要实现什么,您的真实数据是什么样的,您将要执行什么样的查询等等。你的问题是关于继承的,我的回答是,虽然可以做到,但你做错了。在任何情况下,正如我所说,如果您只想从表中检索几个字段,那么您根本不需要继承,而是评估投影操作(即具有特定字段的 SELECT 语句)。
    猜你喜欢
    • 2019-11-25
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多