Room转换器类多参数问题:如何转换含经纬度的Coord类
解决Room TypeConverter单参数限制下Coord类的完整双向转换问题
要在单参数限制下完整保留Coord类的纬度(lat)和经度(lon)信息,核心思路是将Coord对象序列化为**单一字符串(如JSON格式)**进行存储,反向转换时再将字符串反序列化为Coord对象,避免数据丢失。
方案1:使用Gson实现序列化/反序列化
这是Android中最常用的方案,步骤如下:
添加Gson依赖(项目未引入时):
在Module级别的build.gradle的dependencies块中添加:implementation 'com.google.code.gson:gson:2.10.1'修改TypeConverter类:
class CoordConverter { @TypeConverter fun fromCoordToString(coord: Coord): String { return Gson().toJson(coord) } @TypeConverter fun fromStringToCoord(jsonString: String): Coord { return Gson().fromJson(jsonString, Coord::class.java) } }在Room数据库类中注册转换器:
确保你的Room Database类添加@TypeConverters注解指定转换器:@Database(entities = [CurrentWeather::class], version = 1) @TypeConverters(CoordConverter::class) abstract class WeatherDatabase : RoomDatabase() { // 声明DAO接口 abstract fun weatherDao(): WeatherDao }
方案2:使用Kotlinx Serialization(无第三方库依赖)
若不想引入Gson,可使用Kotlin官方序列化库:
添加Kotlinx Serialization依赖:
在Module级别的build.gradle中配置:plugins { id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.20' } dependencies { implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0" }为Coord类添加序列化注解:
@Keep @Serializable data class Coord( var lat: Double = .0, var lon: Double = .0 )实现TypeConverter:
class CoordConverter { private val json = Json { ignoreUnknownKeys = true } @TypeConverter fun fromCoordToString(coord: Coord): String { return json.encodeToString(coord) } @TypeConverter fun fromStringToCoord(jsonString: String): Coord { return json.decodeFromString(jsonString) } }
原理说明
两种方案均通过将Coord对象转换为单一字符串类型,满足Room TypeConverter单参数要求,同时JSON格式能完整保留lat和lon的所有数据,反向转换时可完整恢复对象,不会丢失任何字段。
内容的提问来源于stack exchange,提问作者Muaz Khan
相关产品推荐
相关产品推荐

