可以直接在房间上映射这个场景吗?
是的,你非常接近解决方案。
但它不起作用,因为 PropertyWithAddress 不是数据库实体/视图。
@Relation
您需要在usingentity=
参数中指定要从中提取 POJO 的父级的表/实体(属性) 。(即需要一个实体,而 PropertyWithAddress 不是一个实体)
例如
data class DetailedCustomerInformation(
@Embedded
val customer: Customer,
@Relation(entity = Address::class,parentColumn = "addressId", entityColumn = "id")
val address: Address,
@Relation(entity = Property::class, parentColumn = "propertyId",entityColumn = "id")
val propertyWithAddress: PropertyWithAddress
)
- 请注意,
entity =
即使不需要,我也总是对参数进行编码
因此,使用您的其他实体和@Dao 类的上述和近似值:-
@Dao
abstract class CustomerDao {
@Insert
abstract fun insert(customer: Customer): Long
@Insert
abstract fun insert(address: Address): Long
@Insert
abstract fun insert(property: Property): Long
@Query("SELECT * FROM customer")
abstract fun getDetailedCustomerInformation(): List<DetailedCustomerInformation>
}
然后在活动中使用以下内容(为了方便和简洁,在主线程上运行):-
db = TheDatabase.getInstance(this)
customerDao = db.getCustomerDao()
var a1 = customerDao.insert(Address(addressDetails = "This is address 1"))
var a2 = customerDao.insert(Address(addressDetails = "This is address 2"))
var a3 = customerDao.insert(Address(addressDetails = "This is address 3"))
var p1 = customerDao.insert(Property(addressId = a1,propertyDetails = "This is property1"))
var p2 = customerDao.insert(Property(addressId = a2,propertyDetails = "This is property 2"))
customerDao.insert(Customer(addressId = a3,propertyId = p1,customerDetails = "This is customer 1"))
customerDao.insert(Customer(addressId = a1,propertyId = p2,customerDetails = "This is customer 2"))
var TAG = "CUSTINFO"
for(dci: DetailedCustomerInformation in customerDao.getDetailedCustomerInformation()) {
Log.d("CUSTINFO","Customer Details = ${dci.customer.customerDetails}" +
"\n\tCustomer's address is ${dci.address.addressDetails}" +
"\n\tProperty is ${dci.propertyWithAddress.property.propertyDetails} address is ${dci.propertyWithAddress.address.addressDetails}"
)
}
输出到日志的结果是:-
D/CUSTINFO: Customer Details = This is customer 1
Customer's address is This is address 3
Property is This is property1 address is This is address 1
D/CUSTINFO: Customer Details = This is customer 2
Customer's address is This is address 1
Property is This is property 2 address is This is address 2