¿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:
- Variable 'runnable' debe ser inicializado
- Error en findViewById después de actualizar para compilar la versión de sdk
- ArrayAdapter utiliza Kotlin android
- kotlin suprime la advertencia despreciada para android
- Referencia sin resolver: kotlinx - Kotlin 1-0-0-rc-1036
@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
.
- Suprimir "Identificador no permitido en Android"
- Asociar la certificación para desarrolladores de android
- Crear una instancia de una clase abstracta en Kotlin
- ¿Qué es "implementación" en las dependencias de Kotlin Gradle?
- Gradle dependencia entre tareas
- Gradle kotlin Método no soportado Dependencies.getAtoms ()
- Vinculación de datos de Android y Kotlin
- Kotlin - equivalencia a la combinación de Swift de "if let + cast"
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
- Código VS para Android. ¿Es posible?
- Comprueba el progreso de la opción Cargar y descargar (API de Google Drive para Android o Java)