Как конвертировать data class для ROOM
У меня есть дата класс:
@Entity
data class ArticleEntity(
val sourceEntity: SourceEntity,
val author: String,
val title: String,
val description: String,
val url: String,
val urlToImage: String,
val publishedAt: String,
val content: String
) {
@PrimaryKey(autoGenerate = false)
var id = url
}
И вложенный класс:
@Entity
data class SourceEntity(
val id: String,
val name: String
)
При компилировании ROOM выдаёт ошибку, нужно конвертировать SourceEntity. Я искал в интернете и нашел варианты, но они в целом конвертируют один тип к другому (long на string и т.д) или конвертируют массив. Мне нужно конвертировать этот дата класс SourceEntity в String и обратно. Если кто в этом хорошо разбирается, прошу помочь и пояснить.
Ответы (1 шт):
Автор решения: Isroilov
→ Ссылка
Нашел решение, но могут быть некие недочёты: Создаём класс:
class ArticleTypeConverter {
private val gson: Gson by lazy { Gson() }
@TypeConverter
fun toSource(value: String): SourceEntity {
val arrayTutorialType = object : TypeToken<SourceEntity>() {}.type
return gson.fromJson(value, arrayTutorialType) as SourceEntity
}
@TypeConverter
fun fromSource(value: SourceEntity): String {
return gson.toJson(value)
}
}
добавляем аннотацию в родительском датаклассе над source:Source:
@Entity
data class ArticleEntity(
@field:TypeConverters(ArticleTypeConverter::class)
val source: SourceEntity,
...
и всё заработало