You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Room数据库中复杂数据类型的Type Converter实现疑问

解决Room中Coord类的类型转换问题

Room数据库无法直接存储自定义数据类,对于包含多个属性的Coord(以及其他如Main、Sys等自定义类),最通用的解决方案是将其序列化为JSON字符串存储,读取时再反序列化为原对象。以下是具体实现步骤:

1. 添加Gson依赖(若未添加)

在模块级build.gradle(或build.gradle.kts)的依赖块中添加Gson库,用于JSON序列化/反序列化:

dependencies {
    // 其他依赖...
    implementation 'com.google.code.gson:gson:2.10.1' // 可使用最新版本
}

2. 编写完整的TypeConverters类

替换你现有的TypeConverters类,添加所有自定义类的转换方法:

import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import java.lang.reflect.Type

class TypeConverters {
    private val gson = Gson()

    // Clouds转换(保留你原有的实现,或改用JSON方式)
    @TypeConverter
    fun fromCloudsToInt(clouds: Clouds): Int {
        return clouds.all
    }

    @TypeConverter
    fun fromIntToClouds(all: Int): Clouds {
        return Clouds(all)
    }

    // Coord转换
    @TypeConverter
    fun fromCoordToString(coord: Coord): String {
        return gson.toJson(coord)
    }

    @TypeConverter
    fun fromStringToCoord(coordString: String): Coord {
        return gson.fromJson(coordString, Coord::class.java)
    }

    // Main转换
    @TypeConverter
    fun fromMainToString(main: Main): String {
        return gson.toJson(main)
    }

    @TypeConverter
    fun fromStringToMain(mainString: String): Main {
        return gson.fromJson(mainString, Main::class.java)
    }

    // Sys转换
    @TypeConverter
    fun fromSysToString(sys: Sys): String {
        return gson.toJson(sys)
    }

    @TypeConverter
    fun fromStringToSys(sysString: String): Sys {
        return gson.fromJson(sysString, Sys::class.java)
    }

    // Wind转换
    @TypeConverter
    fun fromWindToString(wind: Wind): String {
        return gson.toJson(wind)
    }

    @TypeConverter
    fun fromStringToWind(windString: String): Wind {
        return gson.fromJson(windString, Wind::class.java)
    }

    // List<Weather>转换
    @TypeConverter
    fun fromWeatherListToString(weatherList: List<Weather>): String {
        return gson.toJson(weatherList)
    }

    @TypeConverter
    fun fromStringToWeatherList(weatherString: String): List<Weather> {
        val type: Type = object : TypeToken<List<Weather>>() {}.type
        return gson.fromJson(weatherString, type)
    }
}

3. 在RoomDatabase类中关联转换器

找到你的WeatherDB类,添加@TypeConverters注解,指定使用上述转换器:

import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters

@Database(entities = [WeatherDTO::class], version = 1)
@TypeConverters(TypeConverters::class)
abstract class WeatherDB : RoomDatabase() {
    abstract fun WeatherDao(): WeatherDao
}

说明

  • 对于Clouds类,你原有的实现只存储了all属性,这种方式适合只需要单个字段的场景;如果之后需要完整的Clouds对象,建议改用JSON转换方式(和Coord一致)。
  • 所有自定义数据类(Main、Sys、Wind)以及List<Weather>都需要对应的转换器,否则Room会抛出无法识别类型的错误。

内容的提问来源于stack exchange,提问作者Jadu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:25:26