Точно один в один Отношение в комнате - PullRequest
0 голосов
/ 07 марта 2019

Я думаю, что об этом спрашивали несколько раз, но никакого рабочего решения нет.

В комнате есть @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
}

Я пробовал использовать несколько методов, а также этот метод (который имеет много голосов, но это не работает).Предположительно,

class UserAndPet {
    @Embedded
    var user: User? = null
    @Embedded
    var pet: Pet? = null
}

Должно работать, но я получаю

Не уверен, как преобразовать курсор в тип возврата этого метода (UserAndPet)

Конфликт не возникает, так как я уже использую prefix для @Embedded полей.

И, пожалуйста, не могли бы вы не перенаправить мою запись на любой другой пост по переполнению стека, как я пробовал все, но не повезло.

Спасибо

1 Ответ

0 голосов
/ 08 марта 2019

Когда мы рассматриваем 1 to 1 отношение ниже, также возможен подход, и для получения дополнительной информации перейдите по ссылке .

@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
}    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...