Android中如何用Retrofit结合Result泛型获取含属性的客户端列表?
实现步骤
1. 完善接口返回的数据结构
原ClientResponse缺少客户端列表字段,需要新增对应字段来承载接口返回的id、name、age等客户端数据:
data class ClientResponse( val success: Boolean, val message: String, val data: List<ClientDto>? // 新增客户端列表字段 ) // 定义与接口返回字段一一对应的客户端数据类 data class ClientDto( val id: String, val name: String, val age: Int // 其他接口返回的字段按需添加 )
2. 更新Retrofit接口定义
接口返回类型无需修改,但后续会用到ClientResponse中的data字段:
@Headers("Content-Type: application/json") @GET("/clients") suspend fun getClientsData(): ClientResponse
3. 调整Repository的返回类型与业务逻辑
将返回类型从Result<String>改为Result<List<ClientDto>>,成功时把接口返回的客户端数据传入Result.Success,同时处理空数据场景:
override suspend fun getClientsData(): Result<List<ClientDto>> { return try { val response = clientTrackerApi.getClientsData() if (response.success) { val clientList = response.data ?: emptyList() Result.Success(data = clientList, errorMessage = "客户端列表获取成功") } else { Result.Error(errorMessage = response.message) } } catch (e: Exception) { Result.Error(errorMessage = e.message ?: "获取客户端列表失败") } }
4. 映射为ClientEntity并存入数据库
先定义数据库实体类ClientEntity,再通过扩展函数完成ClientDto到ClientEntity的映射,最后插入数据库:
// 数据库实体类 data class ClientEntity( @PrimaryKey val id: String, val name: String, val age: Int ) // DTO转Entity的扩展函数 fun ClientDto.toEntity(): ClientEntity { return ClientEntity( id = this.id, name = this.name, age = this.age ) } // 示例:在ViewModel中处理Repository返回并插入数据库 viewModelScope.launch { when(val result = repository.getClientsData()) { is Result.Success -> { val clientEntities = result.data.map { it.toEntity() } clientDao.insertAll(clientEntities) // 调用DAO完成数据库插入 } is Result.Error -> { // 处理错误逻辑 } is Result.Loading -> { // 处理加载状态 } } }
可选:直接在Repository中完成映射
如果希望Repository直接返回映射后的数据库实体,可以在getClientsData中完成转换:
override suspend fun getClientsData(): Result<List<ClientEntity>> { return try { val response = clientTrackerApi.getClientsData() if (response.success) { val clientEntities = response.data?.map { it.toEntity() } ?: emptyList() Result.Success(data = clientEntities, errorMessage = "客户端列表获取成功") } else { Result.Error(errorMessage = response.message) } } catch (e: Exception) { Result.Error(errorMessage = e.message ?: "获取客户端列表失败") } }
内容的提问来源于stack exchange,提问作者Equlo
相关产品推荐
相关产品推荐

