database - 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
解决方案
您是否尝试过在您的实体之间建立关系?关系的 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
表格也将包含地址列。
推荐阅读
- python - 对元组使用startswith,在Python中返回匹配的字符串
- python - 如何在 Pandas 数据框中查找 re.search 失败的行
- php - 在 2 行上制作 prestashop 1.7 名称和描述
- typescript - 将 Typescript Record 或类字典类型与固定键类型合并?
- c# - 使用 ADO.NET 的批处理操作
- c - C中动态二维数组的限制
- jquery - 更改事件的 JQuery 在弹出窗口中不起作用
- boost - How to build boost libraries using cmake
- java - 如果spring jpa中不存在列,如何将实体属性默认值标记为null
- python-3.x - 替换数据框中单元格内的多个值 - Python/Pandas