¿Cómo puedo representar una relación de muchos a muchos con Android Room?

¿Cómo puedo representar una relación de muchos a muchos con Room? Por ejemplo, tengo "Invitado" y "Reserva". Reserva puede tener muchos invitados y un invitado puede ser parte de muchas reservas.

Aquí están mis definiciones de entidades:

@Entity data class Reservation( @PrimaryKey val id: Long, val table: String, val guests: List<Guest> ) @Entity data class Guest( @PrimaryKey val id: Long, val name: String, val email: String ) 

Mientras que mira en docs me encontré con @Relation . Lo encontré realmente confuso sin embargo.

De acuerdo a esto me gustaría crear un POJO y añadir las relaciones allí. Así, con mi ejemplo hice lo siguiente

 data class ReservationForGuest( @Embedded val reservation: Reservation, @Relation( parentColumn = "reservation.id", entityColumn = "id", entity = Guest::class ) val guestList: List<Guest> ) 

Con anterioridad obtengo el error del compilador:

No se puede saber cómo leer este campo desde un cursor.

No pude encontrar una muestra de trabajo de @Relation .

Tuve un problema similar. Aquí está mi solución.

Puede utilizar una entidad adicional ( ReservationGuest ) que mantiene la relación entre Guest y Reservation .

 @Entity data class Guest( @PrimaryKey val id: Long, val name: String, val email: String ) @Entity data class Reservation( @PrimaryKey val id: Long, val table: String ) @Entity data class ReservationGuest( @PrimaryKey(autoGenerate = true) val id: Long, val reservationId: Long, val guestId: Long ) 

Puede obtener reservas con su lista de guestId . (No los objetos invitados)

 data class ReservationWithGuests( @Embedded val reservation:Reservation, @Relation( parentColumn = "id", entityColumn = "reservationId", entity = ReservationGuest::class, projection = "guestId" ) val guestIdList: List<Long> ) 

También puede obtener invitados con su lista de reservationId s. (No los objetos de reserva)

 data class GuestWithReservations( @Embedded val guest:Guest, @Relation( parentColumn = "id", entityColumn = "guestId", entity = ReservationGuest::class, projection = "reservationId" ) val reservationIdList: List<Long> ) 

Puesto que usted puede conseguir el guestId s y reservationId s, usted puede consultar la Reservation y las entidades de la Guest con ésos.

Actualizaré mi respuesta si encuentro una manera fácil de obtener la lista de objetos Reservas y Invitados en lugar de sus identificadores.

Respuesta similar

  • ¿Hay alguna manera de reutilizar una instancia de Job?
  • Anko: alcance interno de la aplicación, confundir la resolución de la propiedad
  • ¿Cuáles son las ventajas del lenguaje de programación Kotlin?
  • Reglas de ProGuard para la reflexión de Kotlin
  • Kotlin palabra clave en línea que causa IntelliJ IDEA Reporte de cobertura 0%
  • ¿Cómo llamar a una función después de la demora en Kotlin?
  • "No hay suficiente información para inferir el parámetro T" con Kotlin y Android
  • Dagger 2 Named no se puede proporcionar sin un método @Provides
  • ¿Cómo funciona la sintaxis de acceso a propiedades de Kotlin para las clases Java?
  • ¿Cómo puedo convertir una parte del archivo de código fuente de Java a Kotlin?
  • Kotlin: Iterate a través de un JSONArray
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.