我要用作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(如果这能让事情变得更简单的话),但我真的很想探索所有的机会来实现这一点。
更改列表
当我想将我的JSON记录到房间数据库中时,我遇到了一个问题。 我的数据类是: )
文件CrimetypeConverters.kt 错误:错误:无法确定如何将此字段保存到数据库中。可以考虑为其添加一个类型转换器。private java.util.date日期;C:\users\asus\AndroidStudioProjects\CriminalIntentV2\app\build\tmp\kapt3\stubs\debug\com\bignerdranch\android\
当我试图在TaskClass中创建一个实体时,它说它无法将优先级类型保存到数据库中,我遇到了这个错误。Priority是我用几个常量变量创建的枚举类。 我的错误 我搞不清楚到底是什么问题。旁注:我正在看一个android开发课程,我只是跟着指导老师,但他做的同样的事情是给我一个错误,我怎么能修复这个问题? 我的优先枚举类 我的任务课 我的项目等级文件 我的模块GRADLE文件
所以,当我试图编译它时,我得到了这个错误: 我不熟悉房间实施,所以我不知道如何解决这个问题。
这是第一次使用Room数据库,我想将数据保存到嵌套类中 植物种类: 这是植物类别类: 我试着用 但这些注释似乎不可用也许我缺少了一个库? 这是我的gradle文件: 我将感谢你的帮助!
我有以下型号: 然后告诉我这个错误: