kotlin - 错误:无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器
问题描述
我要用作的数据类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
)
我的详细信息对象是一个名为的自定义类的列表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
}
这个列表里面只有一个项目。如上面的数据类中所述,我还为实体中的特定字段指定了一个 TypeConverter 类。其定义如下:
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 上发布过类似问题的解决方案。我确实尝试了很多,并试图适应我想要的。我尝试的解决方案是:
他们每个人都有相同的问题 - 在构建应用程序时抛出了与上面发布的相同的错误消息。同样在我编写的每个解决方案的自定义 TypeConverter 中,里面的两个方法总是会在我的 Android Studio 中显示未使用的突出显示。
我也在考虑迁移到 Realm(如果这能让事情变得更容易的话),但我真的很想探索所有的机会来完成这项工作。
解决方案
在 Type Converter 类和 Type Converter 类中都更改List<Details>
为我解决了这个问题。ArrayList<Details>
Entity
推荐阅读
- plc - 设置单位西门子梯形图
- javascript - 如何更改新图像对象的不透明度
- google-sheets - google sheet api python客户端的响应时间不一致且响应时间长
- javascript - 使用 Javasctipt 模拟按住 ctrl 按钮并在 X 秒后释放它
- java - 在 kotlin 中将 xml(带标签)转换为 tikxml 时出现构建错误
- gdb - 如何在 OpenOCD 0.11.0 中启用 GDB 服务器?
- sql - 在其他别名中使用别名?
- javascript - 如果列表中的所有数据属性都等于“off”,则显示“none found”文本
- c++ - C++ Windows 编译程序与 Linux 不同的行为
- java - 按属性合并列表中的对象实例