0

我有这些关系:

客户 > 地址

客户 > 物业

物业 > 地址

所以我正在尝试这样做:

data class DetailedCustomerInformation(
    @Embedded
    val customer: Customer,

    @Relation(parentColumn = "addressId", entityColumn = "id")
    val address: Address,

    @Relation(parentColumn = "propertyId", entityColumn = "id")
    val property: PropertyWithAddress
) : Serializable

PropertyWithAddress 在哪里

data class PropertyWithAddress(
    @Embedded
    var property: Property,

    @Relation(parentColumn = "addressId", entityColumn = "id")
    var address: Address
)

但它不起作用,因为 PropertyWithAddress 不是数据库实体/视图。

我的问题是更可能使用一些房间机制来映射这些关系。我知道我可以直接进行查询并加载对象,但我想知道房间是否以任何方式支持这一点。

4

1 回答 1

0

可以直接在房间上映射这个场景吗?

是的,你非常接近解决方案。

但它不起作用,因为 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
于 2021-09-13T20:10:17.080 回答