Не работает 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 шт):

Автор решения: IR42

Нужно указать, что аннотация для поля:

@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

→ Ссылка