我相信已多次询问过,但没有可行的解决方案。
房间有@Relation
注释,用于一对多的关系。这基本上如果你有User
和Pet
模型,因为User
可以有几个Pet
s,@Relation
注释完美地工作,因为返回类型的Pet
s列表(或设置)。
class UserAndAllPets : User() {
@Relation(parentColumn = "id", entityColumn = "userId")
var pets: List<Pet> = arrayListOf()
}
问题是如果在我的情况下User
和Pet
是一对一相关的。因为每个用户都可以拥有一只宠物。这意味着没有必要使用@Relation
,因为它只支持列表或设置返回类型。使用它作为列表是完全没有效率的,即使我使用它。所以我正在寻找一个确切的一对一关系,我可以得到结果
class UserAndPet {
var user: User? = null
var pet: Pet? = null
}
我尝试了几个以及this方法(它有很多upvotes,但它不起作用)。据称,
class UserAndPet {
@Embedded
var user: User? = null
@Embedded
var pet: Pet? = null
}
应该工作,但我得到了
不确定如何将Cursor转换为此方法的返回类型(UserAndPet)
没有冲突,因为我已经将prefix
用于@Embedded
字段。
请你,你能不能将我的重定向转移到堆栈溢出的任何其他帖子,因为我尝试了所有但没有运气。
谢谢
此功能已添加到房间的2.2.0-alpha01
。
当我们考虑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
}