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
相关产品推荐
相关产品推荐

