安卓Kotlin-存储Gson广播API数据到一个房间数据库



我使用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()                                                     
}
}
}

注意:下面是gsonData被广播到的data class

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
)

您没有根据来自服务器的JSON响应来注释字段。

data class SampleDataInfoItems(
@SerializedName("name_this_field_on_json")
val Code: String,
@SerializedName("and_so_on_for_all_fields")
val Name: String,
val Description: String,
val Item1: BigDecimal,
val Item2: BigDecimal
)

此外,我认为您需要GsonConverterFactory进行改装。

相关内容

最新更新