Banco de dados de sala com classe inline Kotlin como um campo de entidade

9

Estou tentando fazer com que o Room ( https://developer.android.com/topic/libraries/architecture/room ) trabalhe com as classes embutidas do Kotlin, conforme descrito no artigo de Jake Whartons Classes embutidas produzem ótimas IDs de banco de dados :

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

inline class ID(val value: String)

Ao compilar esta sala, reclama-se que

Entidades e Pojos devem ter um construtor público utilizável. Você pode ter um construtor vazio ou um construtor cujos parâmetros correspondam aos campos (por nome e tipo).

Analisando o código Java gerado, encontro:

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, o construtor padrão é privado agora.

Ao usar Stringcomo um tipo para id(ou a typealias), o construtor de classe Java gerado se parece com o esperado:

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

Alguém agora como manter público o construtor padrão ao usar Classes Inline como propriedades da entidade de dados?

whlk
fonte
Você levantou um problema para isso em algum rastreador de problemas? Eu acho que essa necessidade de ser esclarecido com certeza
K.Os

Respostas:

0

Acredito que o motivo é que a classe ID será representada como String em tempo de execução. Portanto, o parâmetro adicional $ constructor_marker é garantir a exclusividade da assinatura do construtor MyEntity (ID da string, título da string), pois esse construtor já poderia ter sido definido. Mas estou apenas especulando aqui.

Você poderia tentar definir explicitamente esse construtor na classe MyEntity e ver se funciona?

Diego Marin
fonte
Este construtor já está definido de forma explícita (mas com açúcar sintático) nodata class MyEntity(@PrimaryKey val id: ID, val title: String)
whlk
Você definiu um construtor com parâmetros (ID, String), eu quis dizer um construtor com (String, String). Eu tentei, mas parece que não é possível. Eu recebi um erro "Conflito de declaração de plataforma".
Diego Marin