我正在使用Room技术开展我的新项目,但我在如何清晰地访问一对一的值方面遇到了困难。
我有关于地址、所有者和站点的实体,所有者和站点都有一个相关联的地址,每个站点都有一个所有者。
是否可以方便地访问这些内容,例如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
)
Dao的
@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