【发布时间】:2020-03-31 15:46:02
【问题描述】:
我正在使用okhttp 从 API 中获取 Json 数据,将其转换为 Gson 以用于其他目的,同时将 API 数据存储到 Room Database 中。 (可以是API json数据本身的存储,也可以是转换后的Gson版本)但是,我在这方面没有成功,希望你能指出我出错的方向。
我想我缺少一个 typeConverter 来转换从 API 检索并转换为 GSON 的数据,以存储在 Room database 中。但是我不确定我在这方面是否正确,或者我的方法首先是否正确。
或者我有一个Entities data class,但gsonData 被转换为SampleData data class,这可能是一个问题吗?
DataGetter
...
...
...
// this suspend function is run within a coroutine.
private suspend fun APICall(url: String, pageNumber: Int, context: Context){
val urlRequest = Request.Builder().url(url).build() // Building of the URL to fetch data
httpClient.newCall(urlRequest).enqueue(object : Callback {
// onFailure -> cutting this out to shorten code
// onResponse is where I am fetching the data and calling put to DB
override fun onResponse(call: Call, response: Response) {
val dataString = response.body!!.string()
val gsonData = gsonResult.fromJson(dataString, SampleData::class.java)
// Do some other stuffs with gsonData separately. This doesn't return anything to gsonData.
putToRoomDb(gsonData, context) // This will eventually be done via another coroutine.
}
}
}
private suspend fun putToRoomDb(sampleData: SampleData, context: Context) {
val db = MyOnlyDatabase.getInstance(context)
db.MyOnlyDao().updateOrInsert(sampleData)
}
实体
@Entity(tableName = "sample_data_code_names")
data class SampleDataEntities(
@PrimaryKey
var Code: Int,
val Name: String,
val Description: String,
val Item1: String,
val Item2: String
)
道
@Dao
interface SampleDataDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun updateOrInsert(sampleDataEntities: SampleDataEntities)
}
数据库
@Database(entities = [SampleDataEntities::class], version = 1, exportSchema = false)
abstract class MyOnlyDatabase: RoomDatabase() {
abstract fun sampleDataDao(): SampleDataDao
companion object {
@Volatile
private var instance: MyOnlyDatabase? = null
fun getInstance(context: Context): MyOnlyDatabase{
return instance ?: synchronized(this) {
instance ?: buildDatabase(context).also { instance = it }
}
}
private fun buildDatabase(context: Context): MyOnlyDatabase{
return Room.databaseBuilder(context, MyOnlyDatabase::class.java, "MyOnlyDatabase.db")
.fallbackToDestructiveMigration()
.build()
}
}
}
注意:下面是data class,gsonData 被转换成。
data class SampleData(val value: List<SampleDataInfoItems>)
data class SampleDataInfoItems(
val Code: String,
val Name: String,
val Description: String,
val Item1: BigDecimal,
val Item2: BigDecimal
)
【问题讨论】:
标签: android kotlin gson android-room