web-dev-qa-db-fra.com

Room prend-il en charge l'héritage d'entité?

J'essaie de migrer notre projet pour utiliser Room, ce qui, soit dit en passant, est à mon avis un formidable pas en avant.

J'ai la structure suivante:

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
}

Lorsque j'essaie de compiler mon projet, il échoue sans erreur spécifique.

Si j'essaye de le compiler avec une hiérarchie d'entités plate, tout va bien.

Ma question principale est donc la suivante: Room prend-il en charge l'héritage d'entité? Sera-t-il capable d'obtenir les définitions de colonne de la classe parent Entity?

Je voudrais également savoir si l'extension BaseObservable (dont j'ai besoin pour que la liaison de données fonctionne) peut causer des problèmes avec Room? BaseObservable possède un champ transitoire privé, donc cela peut causer des problèmes avec la génération de code.

Existe-t-il des modèles recommandés pour résoudre ce problème, ou devrais-je simplement aplatir ma hiérarchie d'entités?

19
Danail Alexiev

Après une enquête plus approfondie, il s'avère que les entités de salle ne doivent pas étendre la classe BaseObservable. Il contient des champs qui ne peuvent pas être marqués avec @Ignore et interrompre la génération de code.

La chambre fonctionne bien avec l'héritage. Les annotations sont traitées comme prévu et les opérations de base de données se comportent normalement. Vous pouvez étendre à la fois une entité et un POJO.

15
Danail Alexiev