使用Room加载复杂的数据结构(具有关系和继承)

时间:2019-03-12 14:55:06

标签: java android android-room

我的项目中具有继承和经典关系的复杂实体关系。我正在寻找一种优雅的方式来加载自动包含相关数据的数据,以下示例情况应解释该问题。

  1. 假设我具有以下示例实体关系: Example relation of objects to show the problem
  2. 现在,我可以为@EntityCatDogPetHolder创建经典的Holder类。效果很好。
  3. 我现在可以为每个实体创建一个@Dao类,该类处理加载和保存实体的数据。因此,我创建了CatDaoDogDaoPetHolderDaoHolderDao。在每个@Dao类中,我忽略依赖于另一个实体的字段:listHoldPets中的Holderpet和{中的holderPetHolder petHolder中的{1}}。 现在例如装载所有仅包含名称的持有人非常容易,而且空间还可以。保存每个对象也可以正常工作。
  4. 但是现在出现了问题。我想用petHolders列表加载所有Holder。并且每个petHolder还应包含Pet。现在的问题是如何以优雅的方式做到这一点。 Android为关系提供的解决方案仅适用于简单的关系。因此,例如,我可以为其创建一个Pet类和一个HolderWithPetHolder。使用HolderWithPetHolderDao批注,我可以将@Relation的所有petHolders自动加载到holder对象中。但是列表中的所有HolderWithPetHolder对象都不会包含petHolder对象。

如果您有任何代码示例,链接或只是有关此的想法,请告诉我。谢谢!

链接:

Android Room Guideline

Android Room @Relation reference

1 个答案:

答案 0 :(得分:0)

有可能!

您的数据库设计并未从您的ERD中100%清除,因此我对列和表名采取了一些自由,但希望这是有道理的:

public class PetHolderWithPet {

    @Embedded
    private PetHolder;

    @Relation(parentColumn = "petId", entityColumn = "id", entity = Pet.class)
    private Pet;

    // add getters and setters
}


public class HolderWithPetHolderWithPet {

    @Embedded
    private HoldereventSession;

    @Relation(parentColumn = "id", entityColumn = "holderId", entity = PetHolder.class)
    private List<PetHolderWithPet> pets;

    // add getters and setters
}


@Dao
public interface PetDao {

    @Query("select * from holder where id = :id")
    @Transaction
    HolderWithPetHolderWithPet loadItAll(long id);
}

查看此文章: https://medium.com/@jaclync/android-room-with-nested-relationships-803dad19a500