将类转换为一种 SQLite 类型(其中 TEXT 或 BLOB 可能只适用)。
考虑到选项 3 (TyepConverters) 转换数据很少,如果有的话,只使用存储数据,因为您将无法检索数据。
因此,类型转换器应始终配对。
- 其中之一是将类转换为可存储的类型。
- 另一个是将存储类型转换为类。
因此,您将需要相当多的类型转换器,即每个字段 2 个:-
- 云(云类)
- 坐标(坐标类)
- main(主类)
- sys(系统类)
- 天气(类列表)
- 风(风类)
Room 查看字段的 Class 以定位相应的类型转换器。
转换对象(又名类)的最简单方法之一是将对象转换为 JSON 表示。尽管这样做的复杂性在于有许多 JSON 库,并且它们通常会有所不同。
对于遵循 Google 的 JSON 库的示例,已使用。但是,将此库与 Room 一起使用似乎不直接支持使用 List<the_class> 例如列表。
- 对此的依赖(例如)
implementation 'com.google.code.gson:gson:2.10'
作为一个新的班级WeatherList已按以下方式使用:-
data class WeatherList(
val weatherList: List<Weather>
)
并且 WeatherDTO 类已更改为按照以下方式使用它:-
....
//val weather: List<Weather>,
val weather: WeatherList,
....
因此,TypeConverters 类可以是:-
class TypeConverters {
@TypeConverter
fun fromCloudsToJSONString(clouds: Clouds): String = Gson().toJson(clouds)
@TypeConverter
fun toCloudsFromJSONString(jsonString: String): Clouds = Gson().fromJson(jsonString,Clouds::class.java)
@TypeConverter
fun fromCoordToJSONString(coord: Coord): String = Gson().toJson(coord)
@TypeConverter
fun toCoordFromJSONString(jsonString: String): Coord = Gson().fromJson(jsonString,Coord::class.java)
@TypeConverter
fun fromMaintoJSONString(main: Main): String = Gson().toJson(main)
@TypeConverter
fun toMainFromJSONString(jsonString: String): Main = Gson().fromJson(jsonString,Main::class.java)
@TypeConverter
fun fromSysToJSONString(sys: Sys): String = Gson().toJson(sys)
@TypeConverter
fun toSysFromJSONString(jsonString: String): Sys = Gson().fromJson(jsonString,Sys::class.java)
@TypeConverter
fun fromWeatherListFromJSONString(weatherList: WeatherList): String = Gson().toJson(weatherList)
@TypeConverter
fun toWeatherListFromJSOnString(jsonString: String): WeatherList = Gson().fromJson(jsonString,WeatherList::class.java)
@TypeConverter
fun fromWindToJSONString(wind: Wind): String = Gson().toJson(wind)
@TypeConverter
fun toWindFromJSONString(jsonString: String): Wind = Gson().fromJson(jsonString,Wind::class.java)
}
因此,不直接支持的所有类型/类/对象都将转换为/从类型/类/对象的 JSON 字符串表示形式转换。
请注意,您需要添加@TypeConverters(@TypeConverters( value = [<????>.TypeConverters::class])。哪里必须区分你的项目 TypeConverters 类和 Room 的类(TypeConverters 可能不是该类的最佳名称,重命名它会克服区分的需要)
工作示例
下面将上述内容付诸实施。
由于问题不包括基础类,因此使用了以下内容:-
data class Coord(
val longitude: Double,
val latitude: Double
)
data class Clouds(
val cover: Double,
val type: String
)
data class Main(
val main: Double
)
data class Sys(
val sys: Double
)
data class WeatherList(
val weatherList: List<Weather>
)
data class Weather(
val weather: Double
)
data class Wind(
val wind: Double
)
@Dao 注解的接口也是编出来的,简单来说就是:-
@Dao
interface AllDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insert(weatherDTO: WeatherDTO)
@Query("SELECT * FROM weatherdb")
fun getAllFromWeatherDB(): List<WeatherDTO>
}
@Database 带注释的抽象类也由它组成:-
@TypeConverters( value = [a.a.so74384736typeconverterconfusion.TypeConverters::class])
@Database(entities = [WeatherDTO::class], exportSchema = false, version = 1)
abstract class TheDatabase: RoomDatabase() {
abstract fun getAllDao(): AllDao
companion object {
private var instance: TheDatabase? = null
fun getInstance(context: Context): TheDatabase {
if (instance==null) {
instance = Room.databaseBuilder(context,TheDatabase::class.java,"the_database.db")
.allowMainThreadQueries()
.build()
}
return instance as TheDatabase
}
}
}
最后一些活动代码来实际做某事(存储和检索一些数据):-
class MainActivity : AppCompatActivity() {
lateinit var db: TheDatabase
lateinit var dao: AllDao
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
db = TheDatabase.getInstance(this)
dao = db.getAllDao()
dao.insert(
WeatherDTO(
"base001",
Clouds(25.5,"cumulus"),10,
Coord(10.567,30.345),
11,
12,
Main(12345.67890),
"thename",
Sys(9.87654321),
14,
1000,
WeatherList(listOf(Weather(5.1234),Weather(6.5432), Weather(7.6543))),
Wind(23.12)
)
)
for (wdto in dao.getAllFromWeatherDB()) {
Log.d("DBINFO","base = ${wdto.base} longitude = ${wdto.coord.longitude} latitude = ${wdto.coord.latitude} etc ....")
}
}
}
结果
运行日志时,如预期的那样:-
D/DBINFO: base = base001 longitude = 10.567 latitude = 30.345 etc ....
使用 App Inspection 然后数据库看起来像:-
- 转换为 JSON 字符串的字段已突出显示。
- 很明显,由于类的原因,数据很可能与您预期的不完全一样。