Android Kotlin - Сохранение приведенных данных Gson API в базе данных комнат - PullRequest
0 голосов
/ 31 марта 2020

Я использую 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
)

1 Ответ

0 голосов
/ 31 марта 2020

Вы не аннотируете свои поля в соответствии с ответом 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
)

Также я думаю, что вам нужно GsonConververFactory для модернизации.

...