我试图在数组列表中插入response.body(),但是它为空。这个想法是将数据从服务器发送到数据库。我可以毫无问题地在recyclerview中显示它,但是不知道如何在本地存储所有数据。
代码在这里:
val service = client!!.create(ApiInterface::class.java)
val call = service.pOIs
call!!.enqueue(object : Callback<PoiResponse?> {
override fun onResponse(call: Call<PoiResponse?>, response: Response<PoiResponse?>) {
if (response.isSuccessful) {
val result = response.body()
//here i send the response to a poi model to show it in a recyclerview, works fine
val poiList: ArrayList<Poi>? = result?.list
//same data, but for persistence
val poiRoomList: ArrayList<PoiRoom>? = result?.roomList //here is getting null
onFinishedListener!!.onFinished(poiList, poiRoomList)
响应:
class PoiResponse {
var list: ArrayList<Poi>? = null
var roomList: ArrayList<PoiRoom>? = null
}
道:
@Dao
interface PoiDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insert(poiRoom: PoiRoom)
@Insert(onConflict = REPLACE)
fun insertAllPois(poisRoomList: List<PoiRoom>?);
@Query("SELECT * FROM poi_table")
fun getAllPois(): LiveData<List<PoiRoom>>
}
实体:
@Entity(tableName = "poi_table")
class PoiRoom(
@PrimaryKey(autoGenerate = true)
var id: Int = 0,
@ColumnInfo(name = "title")
val title: String,
@ColumnInfo(name = "address")
val address: String,
@ColumnInfo(name = "transport")
val transport: String,
@ColumnInfo(name = "email")
val email: String,
@ColumnInfo(name = "geocoordinates")
val geocoordinates: String,
@ColumnInfo(name = "description")
val description: String)
Json回应,一个兴趣点列表:
{
"list": [
{
"id": "1",
"title": "Casa Batlló",
"geocoordinates": "41.391926,2.165208"
},
{
"id": "2",
"title": "Fundació Antoni Tàpies",
"geocoordinates": "41.39154,2.163835"
},
数据库类:
@Database(entities = [PoiRoom::class], version = 1)
abstract class PoiRoomDatabase : RoomDatabase() {
abstract fun poiDao(): PoiDao
companion object {
@Volatile
private var INSTANCE: PoiRoomDatabase? = null
fun getDatabase(
context: Context,
scope: CoroutineScope
): PoiRoomDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
PoiRoomDatabase::class.java,
"poi_database"
)
.fallbackToDestructiveMigration()
.build()
INSTANCE = instance
instance
}
}
}
}
解决方案:
1º)从响应中删除数组列表
2º)用这样的政治家映射房间清单:
val mappedRoomList = poiList?.map { PoiRoom(it.id, it.title, it.address, it.transport, it.email, it.geocoordinates, it.description) }
3º)创建了将映射列表添加到roomdatabase的方法:
override fun sendDataToRoomDataBase(poiOfflineList: List<PoiRoom?>?) {
poiDao?.insertAllPois(poiOfflineList)
}
4º)创建了转换器:
class PoiConverters {
private val gson = Gson()
@TypeConverter
fun stringToListPoi(data: String?): List<Poi?>? {
if (data == null) {
return Collections.emptyList()
}
val listType: Type = object :
TypeToken<List<Poi?>?>() {}.type
return gson.fromJson<List<Poi?>>(data, listType)
}
@TypeConverter
fun listPoiToString(list: List<Poi?>?): String? {
return gson.toJson(list)
}
}
多数民众赞成在:)
答案 0 :(得分:1)
据我所知,请检查您的Json响应:那里只有“列表”键,没有“ roomList”键。这意味着,当您解析响应Json并将其插入ArrayList时,您只会“填充”列表类型的对象,而不是“ roomList”,因为它不存在! 我要做的是映射您的响应列表,并使用map函数将其映射到RoomList对象。 尝试这样的事情:
override suspend fun insertAllPoiIntoDb(poiList: List<Poi>) {
yourDatabase.yourDao().insertAllObjectsFunction(
poiList.map {
it.toRoomObject()
}
)
}
toRoomObject()函数表示Poi对象中的某些函数逻辑,该函数将Poi转换为RoomPoi(即对象的构造)。