在房间里完全一对一的关系

问题描述 投票:0回答:1

我相信已多次询问过,但没有可行的解决方案。

房间有@Relation注释,用于一对多的关系。这基本上如果你有UserPet模型,因为User可以有几个Pets,@Relation注释完美地工作,因为返回类型的Pets列表(或设置)。

class UserAndAllPets : User() {
   @Relation(parentColumn = "id", entityColumn = "userId")
   var pets: List<Pet> = arrayListOf()
 }

问题是如果在我的情况下UserPet是一对一相关的。因为每个用户都可以拥有一只宠物。这意味着没有必要使用@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字段。

请你,你能不能将我的重定向转移到堆栈溢出的任何其他帖子,因为我尝试了所有但没有运气。

谢谢

android sqlite kotlin android-room
1个回答
1
投票

此功能已添加到房间的2.2.0-alpha01

Ref - Room release 2.2.0-alpha01


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
}    
© www.soinside.com 2019 - 2024. All rights reserved.