Database di sala con classe incorporata di Kotlin come campo Entità


9

Sto cercando di far funzionare Room ( https://developer.android.com/topic/libraries/architecture/room ) con le classi inline di Kotlin come descritto nell'articolo di Jake Whartons Classi inline Crea grandi ID del database :

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

inline class ID(val value: String)

Quando si compila questa stanza si lamenta che

Entità e Pojo devono avere un costruttore pubblico utilizzabile. Puoi avere un costruttore vuoto o un costruttore i cui parametri corrispondono ai campi (per nome e tipo).

Osservando il codice Java generato trovo:

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 il costruttore predefinito è privato ora.

Quando si utilizza Stringcome tipo per id(o a typealias), il costruttore della classe Java generato appare come previsto:

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

Qualcuno ora come mantenere pubblico il costruttore predefinito mentre utilizza le classi inline come proprietà dell'entità dati?


Hai sollevato un problema per questo su alcuni tracker di problemi? Immagino che questo debba essere chiarito di sicuro
K.Os

Risposte:


0

Credo che il motivo sia che la classe ID verrà rappresentata come stringa in fase di esecuzione. Quindi il parametro aggiuntivo $ constructor_marker è di garantire l'unicità della firma del costruttore MyEntity (String id, String title), poiché questo costruttore potrebbe essere già stato definito. Ma sto solo speculando qui.

Potresti provare a definire esplicitamente questo costruttore nella classe MyEntity e vedere se funziona?


Questo costruttore è già definito esplicitamente (ma con zucchero sintattico) neldata class MyEntity(@PrimaryKey val id: ID, val title: String)
whlk

Hai definito un costruttore con (ID, String) parametri, intendevo un costruttore con (String, String). Ci ho provato, ma sembra che non sia possibile. Ho ricevuto un errore "Scontro dichiarazione piattaforma".
Diego Marin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.