Base de datos de sala con clase en línea Kotlin como un campo de entidad

10

Estoy tratando de hacer que Room ( https://developer.android.com/topic/libraries/architecture/room ) funcione con las clases en línea de Kotlin como se describe en el artículo de Jake Whartons. Las clases en línea son excelentes ID de bases de datos :

@Entity
data class MyEntity(
    @PrimaryKey val id: ID,
    val title: String
)

inline class ID(val value: String)

Al compilar esta sala se queja de que

Las entidades y los Pojos deben tener un constructor público utilizable. Puede tener un constructor vacío o un constructor cuyos parámetros coincidan con los campos (por nombre y tipo).

Buscando en el código Java generado encuentro:

private MyEntity(String id, String title) {
      this.id = id;
      this.title = title;
}

// $FF: synthetic method
public MyEntity(String id, String title, DefaultConstructorMarker $constructor_marker) {
      this(id, title);
}

Misteriosamente, el constructor predeterminado es privado ahora.

Cuando se usa Stringcomo tipo para id(o a typealias), el constructor de clase Java generado se ve como se esperaba:

public MyEntity(@NotNull String id, @NotNull String title) {
  Intrinsics.checkParameterIsNotNull(id, "id");
  Intrinsics.checkParameterIsNotNull(title, "title");
  super();
  this.id = id;
  this.title = title;
}

¿Alguien ahora cómo mantener público el constructor predeterminado mientras se utilizan las clases en línea como propiedades de entidad de datos?

whlk
fuente
1
¿Surgió un problema para esto en algún rastreador de problemas? Supongo que esto debe aclararse con seguridad
K.Os

Respuestas:

0

Creo que la razón es que la clase ID se representará como String en tiempo de ejecución. Entonces, el parámetro adicional $ constructor_marker es garantizar la unicidad de la firma del constructor MyEntity (String id, String title), porque este constructor ya podría haberse definido. Pero solo estoy especulando aquí.

¿Podría intentar definir explícitamente este constructor en la clase MyEntity y ver si funciona?

Diego Marin
fuente
Este constructor ya está definido explícita (pero con azúcar sintáctico) en eldata class MyEntity(@PrimaryKey val id: ID, val title: String)
whlk
1
Definiste un constructor con parámetros (ID, String), quise decir un constructor con (String, String). Lo intenté, pero parece que no es posible. Recibí el error "Choque de declaración de plataforma".
Diego Marin