当前位置: 首页 > 知识库问答 >
问题:

错误:无法确定如何将该字段保存到数据库中。您可以考虑为其添加类型转换器

冯新知
2023-03-14

我要用作Entity的数据类如下:

@Entity(tableName = "weather_response")
data class CurrentWeatherResponse(
    @PrimaryKey(autoGenerate = false) var id_count: Int = 0,
    @Embedded(prefix = "coord_") val coord: Coord,
    @Embedded(prefix = "details_") @TypeConverters(value = [(DetailTypeConverters::class)]) @SerializedName("weather") val details: List<Details>,
    val base: String,
    @Embedded(prefix = "main_") val main: Main,
    val visibility: Int,
    @Embedded(prefix = "wind_") val wind: Wind,
    val dt: Long,
    @Embedded(prefix = "sys_") val sys: Sys,
    val timezone: Int,
    val name: String,
    val cod: Int
)

My details对象是一个名为details的自定义类的列表,其中包含:

@Entity(tableName = "details")
data class Details(
    val id: Int,
    val main: String,
    val description: String,
    val icon: String
) {
    @PrimaryKey(autoGenerate = false) var id_count = 0
}

此列表中只有一项。正如上面的数据类中提到的,我还为实体中的特定字段指定了一个TypeConzer类。其定义如下:

class DetailTypeConverters: Serializable {
    companion object {
        val gson = Gson()

        @TypeConverter fun detailsToString(details: List<Details>): String {
            return gson.toJson(details)
        }

        @TypeConverter fun stringtoDetails(value: String): List<Details> {
            val type = object : TypeToken<List<Details>>() {}.type
            return gson.fromJson(value, type)
        }
    }
}

为了完成我的问题,下面是我的RoomDatabase实现:

@Database(
    entities = [CurrentWeatherResponse::class,Coord::class,Main::class,Sys::class,Wind::class,Details::class],
    version = 1
)
@TypeConverters(DetailTypeConverters::class)
abstract class ForecastDatabase: RoomDatabase() {
    abstract fun currentWeatherDao(): CurrentWeatherDao

    companion object {
        @Volatile private var instance: ForecastDatabase? = null
        private var LOCK = Any()

        operator fun invoke(context: Context) = instance ?: synchronized(LOCK) {
            instance ?: buildDatabase(context).also { instance = it }
        }

        private fun buildDatabase(context: Context) =
            Room.databaseBuilder(context.applicationContext, ForecastDatabase::class.java, "forecast.db")
                .build()
    }
}

采用这种方法,我在构建应用程序时会出现以下错误:

C:\Users\Spark\SimpleWeather\app\build\tmp\kapt3\stubs\debug\com\a5corp\weather\data\network\response\current\CurrentWeatherResponse.java:14: error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
    private final com.a5corp.weather.data.network.response.current.Detail details = null;

甚至我也怀疑出了问题,因为我的IDE没有显示任何地方都可以使用的DetailTypeConverters中的函数。像这样:

我知道很多人过去也在StackOverflow上发布过类似问题的解决方案。我确实试过很多,试着适应我想要的。我尝试过的解决方案有:

  • 使用其他类

他们每个人都有同样的问题——在构建应用程序时,会抛出上面发布的相同的错误信息。此外,在我写的每个解决方案的自定义TypeConzer中,里面的两个方法将始终显示在我的Android Studio中未使用的高亮显示。

我也在考虑迁移到Realm(如果这能让事情变得更简单的话),但我真的很想探索所有的机会来实现这一点。

共有1个答案

花俊雄
2023-03-14

更改列表

 类似资料: