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

Room实体ID自增失效:映射Retrofit对象时编译器要求传入ID

解决Room自增ID在实体映射时的必填问题

编译报错No value passed for parameter 'id'的核心原因是:ProductEntity的id字段是不可空val类型且无默认值,创建实例时必须显式传入参数,但我们需要Room自动生成该自增主键,只需调整实体类定义即可解决。

修改Room实体类

给id字段添加默认值,这样创建实体对象时无需传入该参数,Room插入数据时会自动生成并替换为自增ID:

@Entity
data class ProductEntity(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    val id: Int = 0, // 默认值仅用于编译通过,Room会自动替换为自增主键
    @ColumnInfo(name = "productId")
    val productId: String,
    @ColumnInfo(name = "types")
    val types: List<String>,
)

映射器代码保持不变

修改实体类后,原有的映射器代码无需调整,编译即可通过:

fun RetrofitProduct.toEntity(): ProductEntity {
    return ProductEntity(
        productId = this.id,
        types = this.types,
    )
}

分页逻辑补充说明

如果依赖Room自增ID实现分页,需要注意:

  • 若存在数据删除操作,自增ID会出现断层,可能导致分页漏数据;更可靠的方式是结合RetrofitProduct中的date字段排序,以上一页最后一条的日期作为下一页查询条件。
  • 使用Room的@Insert注解时,可将返回值设为Long类型,直接获取插入后自动生成的ID,便于后续分页逻辑使用。

内容的提问来源于stack exchange,提问作者Seb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:55:03