Вы должны определить свой собственный конвертер для типов, которые не поддерживаются Room. В основном SQLite поддерживает только примитивные типы в качестве полей столбцов.
Для каждого сложного типа данных вы должны определить пользовательский конвертер, так как Room не знает, как сериализовать ваш сложный тип в столбцах базы данных.
Для этого вам нужно создать конвертер, который отвечает за преобразование вашего сложного структурированного типа в примитивные поля:
например. (из документации на андроид)
class Converters {
@TypeConverter
fun fromTimestamp(value: Long?): Date? {
return value?.let { Date(it) }
}
@TypeConverter
fun dateToTimestamp(date: Date?): Long? {
return date?.time?.toLong()
}
}
В вашем случае самым простым способом было бы использовать GSON для сериализации вашего объекта в виде строки JSON (когда вы пишете в свою базу данных - Room поддерживает строку), а затем анализировать строку из базы данных в вашу Location
объект при чтении из базы
В вашем случае я бы сделал что-то вроде:
class LocationConverter {
@TypeConverter
fun toLocation(locationString: String?): Location? {
return try {
Gson().fromJson(locationString, Location::class.java)
} catch (e: Exception) {
null
}
}
@TypeConverter
fun toLocationString(location: Location?): String? {
return Gson().toJson(location)
}
}
Как только вы закончите с конвертером, аннотируйте вашу базу данных с помощью LocationConverter
, который вы только что определили, и все готово!
@TypeConverters(LocationConverter::class)
abstract class YourDatabase : RoomDatabase() {
// your code
}