我相信已经问过几次了,但没有有效的解决方案。
房间有@Relation
批注,用于一对多关系。基本上就是如果您有User
和Pet
模型,因为User
可以有多个Pet
,因此@Relation
注释可以作为{{1}的返回类型}是列表(或集合)。
Pet
问题是,在我的情况下,class UserAndAllPets : User() {
@Relation(parentColumn = "id", entityColumn = "userId")
var pets: List<Pet> = arrayListOf()
}
和User
是一对一相关的。因为每个用户都可以养一只宠物。这意味着使用Pet
是没有意义的,因为它仅支持列表或设置返回类型。即使使用列表,将其用作列表也完全没有效率。所以我正在寻找一个精确的一对一关系,我可以得到
@Relation
我尝试了几种和this方法一样的方法(有很多支持,但是不起作用)。
class UserAndPet {
var user: User? = null
var pet: Pet? = null
}
应该可以,但是我得到了
不确定如何将Cursor转换为该方法的返回类型(UserAndPet)
没有冲突,因为我已经在class UserAndPet {
@Embedded
var user: User? = null
@Embedded
var pet: Pet? = null
}
字段中使用了prefix
。
另外,请问,您不能将我重定向到堆栈溢出时的其他任何帖子吗,因为我尝试了所有尝试但没有运气。
谢谢
答案 0 :(得分:0)
当我们考虑采用以下方法建立1 to 1
关系时,也可以采用这种方法,有关更多信息,请遵循link。
@Entity(tableName = "user")
class User(
val id: Int
// ...
) {
@Ignore /* Ignores the marked element from Room's processing logic. */
var pet: Pet? = null
}
@Entity(tableName = "pet")
class Pet(
val id: Int,
val userId: Int
)
/* Single task used for 1 to 1 read */
class UserWithPetReadTask : RxTask.CallableWithArgs() {
private var result = UserWithPetTaskResult()
override fun call(params: Array<out Any>?): Any {
App.mApp?.getDBLocked { appDb ->
/* Read user details from repo */
val user: User? = appDb?.getUserDao()?.getUserById("[userId]")
user.let {
/* Read pet associated and assign it to user*/
it?.pet = appDb?.getPetDao().getPetAssociated("[userId] or [user?.id]")
result.user = user
result.isSuccess = true
}
}
return result
}
}
class UserWithPetTaskResult {
var isSuccess = false
var user: User? = null
}
答案 1 :(得分:0)
此功能自2.2.0-alpha01
起已添加。