Я использую okhttp
для извлечения Json данных из API, преобразования их в 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
)