Не работает TypeConverters в Room
Класс БД
@Entity
data class ObjectEntity(
val active: Boolean,
val comment: String?,
@PrimaryKey(autoGenerate = false)
val id: Long,
val folderId: Long,
val imei: String?,
val name: String?,
@TypeConverters(ObjectSettingsTypeConvert::class)
var settings: List<ObjectSetting>? ,
val stateNumber: String?,
val typeId: Long
)
data class ObjectSetting(
val id: Long,
val name: String?,
val type: Int
)
Есть конвертер
class ObjectSettingsTypeConvert {
private val gson: Gson by lazy { Gson() }
@TypeConverter
fun fromList(value: List<ObjectSetting>): String? {
return if (!value.isNullOrEmpty())
gson.toJson(value)
else
null
}
@TypeConverter
fun toList(value: String?): List<ObjectSetting>? {
if (value.isNullOrEmpty()) return null
val arrayTutorialType = object : TypeToken<List<ObjectSetting>>() {}.type
return gson.fromJson(value, arrayTutorialType) as List<ObjectSetting>
}
}
Есть ошибка:
E:\SOURCE\android\appproject-android-app\app\build\tmp\kapt3\stubs\debug\ru\mydomain\appproject\data\db\model\ObjectEntity.java:19: error: Cannot figure out how to save this field into database. You can consider adding a type converter for it. private java.util.List settings;
Чего я не вижу? Что не так?
Ответы (1 шт):
Нужно указать, что аннотация для поля:
@field:TypeConverters(ObjectSettingsTypeConvert::class)
Иначе она добавляется не туда, куда нужно
Если вы не сделали указание, аннотация будет применена к элементу, выбранному в соответствии с аннотацией @Target той аннотации, которую вы используете. Если существует несколько элементов, к которым возможно применение аннотации, будет выбран первый подходящий элемент из следующего списка:
- param
- property
- field
Так как в данном случае аннотация стоит в конструкторе, то без указания выбирается param (параметр конструктора)
https://kotlinlang.ru/docs/reference/annotations.html в конце раздела Аннотации с указаниями https://kotlinlang.org/docs/reference/annotations.html#annotation-use-site-targets