首页 > 解决方案 > Android Room Database:如何嵌入多个实体

问题描述

我正在为我的新项目使用空间,但我正在努力解决如何干净地访问一对一的值
我有地址、所有者和站点的实体,所有者和站点都有一个关联的地址,并且每个站点都有一个
所有者可以干净地访问这些,例如site.owner.address.l1

我已经调查过了,@Relation虽然它返回的列表不太理想

实体

@Entity(tableName="addresses")
data class Address(
    @PrimaryKey
    @ColumnInfo(name="address_id")
    val id: Int,

    @ColumnInfo(name="address_l1")
    val l1: String
)

@Entity(tablename="owners")
data class Owner(
    @PrimaryKey
    @ColumnInfo(name="owner_id")
    val id: Int,

    @ColumnInfo(name="owner_name")
    val name: String
)

@Entity(tableName="sites")
data class Site(
    @PrimaryKey
    @ColumnInfo(name="site_id")
    val id: Int,

    @ColumnInfo(name="site_addressid")
    val addressid: Int

    @ColumnInfo(name="site_ownerid")
    val ownerid: Int
)

道氏

@Query("SELECT * FROM sites")
fun getSites(): List<Site>

@Query("SELECT * FROM owners")
fun getOwners(): List<Owner>

@Query("SELECT * FROM addresses")
fun getAddresses(): List<Address>

@Query("SELECT * FROM sites JOIN address ON sites.site_addressid = address.address_id JOIN owners ON sites.site_ownerid = owners.owner_id JOIN address ON owners.owner_addressid = address.address_id WHERE sites.site_id = :siteid")
fun getSiteByIdWithDetails(siteid): Site

我只能看到多个 POJO 的方法来完成这项工作,例如
无效但大致正确

data class OwnerAddress(
    @Embedded
    val owner: Owner,

    @Embedded
    val address: Address
)

data class SiteAddress(
    @Embedded
    val site: Site,

    @Embedded
    val owner: OwnerAddress,

    @Embedded
    val address: Address
}

并通过

@Query("SELECT * FROM sites JOIN address ON sites.site_addressid = address.address_id JOIN owners ON sites.site_ownerid = owners.owner_id JOIN address ON owners.owner_addressid = address.address_id WHERE sites.site_id = :siteid")
fun getSiteByIdWithDetails(siteid): SiteAddress

标签: databasekotlinpersistenceandroid-room

解决方案


您是否尝试过在您的实体之间建立关系?关系的 Android 文档

@Entity(tableName="addresses")
data class Address(
    @PrimaryKey
    @ColumnInfo(name="address_id")
    val id: Int,

    @ColumnInfo(name="address_l1")
    val l1: String
)

@Entity(tablename="owners")
data class Owner(
    @PrimaryKey
    @ColumnInfo(name="owner_id")
    val id: Int,

    @ColumnInfo(name="owner_name")
    val name: String

    @ColumnInfo(name="owner_adress")
    @Entity val adress: Address
)

@Entity(tableName="sites")
data class Site(
    @PrimaryKey
    @ColumnInfo(name="site_id")
    val id: Int,

    @ColumnInfo(name="site_owner")
    @Embedded val owner: Owner

    @ColumnInfo(name="site_address")
    @Embedded val address: Address
)

所以现在您的站点有一个地址和一个所有者(有它的地址)。您的sites表格和owners表格也将包含地址列。


推荐阅读