Base de données de pièce avec la classe en ligne Kotlin comme champ d'entité


10

J'essaie de faire fonctionner Room ( https://developer.android.com/topic/libraries/architecture/room ) avec les classes en ligne de Kotlin comme décrit dans l' article de Jake Whartons Les classes en ligne font de grands ID de base de données :

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

inline class ID(val value: String)

Lors de la compilation de cette salle se plaint que

Les entités et les Pojos doivent avoir un constructeur public utilisable. Vous pouvez avoir un constructeur vide ou un constructeur dont les paramètres correspondent aux champs (par nom et type).

En regardant dans le code Java généré, je trouve:

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);
}

Mystérieusement, le constructeur par défaut est désormais privé.

Lors de l'utilisation Stringcomme type pour id(ou a typealias), le constructeur de classe Java généré ressemble à celui attendu:

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

Est-ce que quelqu'un maintenant comment garder le constructeur par défaut public tout en utilisant des classes en ligne comme propriétés d'entité de données?


1
Avez-vous soulevé un problème pour cela sur un tracker de problème? Je suppose que cela doit être clarifié à coup sûr
K.Os

Réponses:


0

Je crois que la raison en est que la classe ID sera représentée sous forme de chaîne lors de l'exécution. Ainsi, le paramètre supplémentaire $ constructor_marker est de garantir l'unicité de la signature du constructeur MyEntity (String id, String title), car ce constructeur aurait déjà pu être défini. Mais je ne fais que spéculer ici.

Pourriez-vous essayer de définir explicitement ce constructeur dans la classe MyEntity et voir si cela fonctionne?


Ce constructeur est déjà défini explicite (mais avec du sucre syntaxique) dans ledata class MyEntity(@PrimaryKey val id: ID, val title: String)
whlk

1
Vous avez défini un constructeur avec (ID, String) paramètres, je voulais dire un constructeur avec (String, String). J'ai essayé, mais il semble que ce ne soit pas possible. J'ai reçu une erreur "Clash de déclaration de plate-forme".
Diego Marin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.