web-dev-qa-db-ja.com

ルームはエンティティの継承をサポートしていますか?

私は、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にはプライベートな一時フィールドが1つあるため、コード生成で問題が発生している可能性があります。

これに対処するための推奨パターンはありますか、またはエンティティ階層をフラット化する必要がありますか?

19
Danail Alexiev

さらに調査した結果、RoomエンティティはBaseObservableクラスを拡張しないことが判明しました。 @Ignoreでマークできず、コード生成を中断できないフィールドが含まれています。

部屋は継承に適しています。注釈は期待どおりに処理され、DB操作は正常に動作します。エンティティとPOJOの両方から拡張できます。

15
Danail Alexiev