You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:06:33