【问题标题】:Does Room support entity inheritance?Room 是否支持实体继承?
【发布时间】:2017-09-20 08:29:49
【问题描述】:

我正在尝试迁移我们的项目以使用 Room,顺便说一下,我认为这是向前迈出的一大步。

我有以下结构:

public class Entity extends BaseObservable {

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "_id", typeAffinity = ColumnInfo.INTEGER) 
    private long mId;

    @ColumnInfo(name = "is_dirty")
    @TypeConverters(BooleanTypeConverter.class)
    private boolean mIsDirty;

    // default constructor and accessors omitted for brevity
}

@Entity(tableName = "some_entities")
public class SomeEntity extends Entity {

    @ColumnInfo(name = "type", typeAffinity = ColumnInfo.TEXT)        
    private String mType;

    @ColumnInfo(name = "timestamp", typeAffinity = ColumnInfo.INTEGER)
    private long mTimestamp;

    // constructor, accessors
}

当我尝试编译我的项目时,它失败了,没有具体错误。

如果我尝试使用平面实体层次结构编译它,一切都很好。

所以,我的主要问题是: Room 是否支持实体继承?是否能够从父 Entity 类中获取列定义?

我还想知道扩展BaseObservable(我需要让数据绑定工作)是否会导致 Room 出现问题? BaseObservable 有一个私有瞬态字段,所以这可能会导致代码生成出现一些问题。

是否有任何推荐的模式来处理这个问题,或者我只需要展平我的实体层次结构?

【问题讨论】:

  • 所以,我做了更多的测试,结果证明:是的,Room 确实支持继承,是的,扩展 BaseObservable 是一个问题。我目前正在从实体层次结构中删除 BaseObservable。

标签: android-room


【解决方案1】:

经过进一步调查,事实证明房间实体不应扩展 BaseObservable 类。它包含不能用@Ignore 标记的字段并破坏代码生成。

Room 与继承配合得很好。注释按预期处理,数据库操作正常。您可以从 Entity 和 POJO 扩展。

【讨论】:

  • kotlin 中是否支持将 TypeConverters 放到公开课上?万一你知道了
  • 您能否提供一些示例代码 sn-ps,您是如何设置继承实体并从数据库中查询扩展实体的?
  • 我在扩展对象时遇到问题,因为 Dao 验证使用父类而不是子扩展类。
  • @DeaMon1,您是否将 tableName 值传递给了父或子或两者的实体注释?
  • @lucidbrot 是的。您可以创建一个返回子类型的查询,并在查询子句中访问基类的属性。
猜你喜欢
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多