房间中的一对一关系

时间:2019-03-07 00:27:46

标签: android sqlite kotlin android-room

我相信已经问过几次了,但没有有效的解决方案。

房间有@Relation批注,用于一对多关系。基本上就是如果您有UserPet模型,因为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

另外,请问,您不能将我重定向到堆栈溢出时的其他任何帖子吗,因为我尝试了所有尝试但没有运气。

谢谢

2 个答案:

答案 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起已添加。

参考-Room release 2.2.0-alpha01