He visto esta pregunta varias veces en SO. sin embargo, la solución no parece aplicarse a mi problema.
Tengo una clase de datos de Kotlin que se usa como entidad en la sala.
@Entity(tableName = "training_session") data class SessionEntity( @PrimaryKey(autoGenerate = false) val id: Long, @ColumnInfo(name = "current_state_marker") val currentState: Short, @Embedded val states: List<Int> )esta produciendo
> Task :training-infrastructure:kaptDebugKotlin FAILED error: Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type). - java.util.List error: Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type). - java.util.ListEn el mismo proyecto tengo una entidad muy similar que también tiene una lista y eso no produce ningún error.
Probé la respuesta proporcionada por MikeT , para mí requirió un pequeño cambio en la forma en que se definieron los convertidores.
data class SessionStateList (val stateList : List<Int>) class SessionStateListConverter { @TypeConverter fun fromArraySessionStateList(sh: List<Int>?): String? { return Gson().toJson(sh) } @TypeConverter fun toArraySessionStateList(sh: String?): List<Int>? { val listType: Type = object : TypeToken<ArrayList<Int?>?>() {}.type return Gson().fromJson(sh,listType) } } Un seguimiento rápido. Mencioné que tengo otra entidad que tiene un Embedded val something: List<Int> y no noté ningún error de compilación.
La razón por la que no noté ningún error del compilador fue porque la entidad no estaba incluida en la anotación @Database .
No puede tener una lista/matriz, etc. como tipo de columna. Por lo tanto, su problema se centra en @Embedded val states: List<Int>
Podría tener un POJO, por ejemplo, StatesHolder: -
data class StatesHolder( val stateList: List<Int> )y luego tener
@Entity(tableName = "training_session") data class SessionEntity( @PrimaryKey(autoGenerate = false) val id: Long, @ColumnInfo(name = "current_state_marker") val currentState: Short, val states: StatesHolder )Luego necesitará TypeConverters para convertir hacia y desde un objeto StatesHolder a un tipo que se pueda almacenar. Probablemente una cadena y probablemente una representación JSON del objeto StatesHold, por ejemplo
class Converters { @TypeConverter fun fromStatesHolder(sh: StatesHolder): String { return Gson().toJson(sh) } @TypeConverter fun toStatesHolder(sh: String): StatesHolder { return Gson().fromJson(sh,StatesHolder::class.java) } }Además, debe usar la anotación @TypeConverters que define la clase Converts::. Si se codifica en el nivel @Database, los convertidores tienen alcance completo.
Entonces, después de @Database(.....) podrías tener: -
@TypeConverters(Converters::class)