插入Room数据库实体时如何忽略主键?@AutoGenerate能否解决该问题?
Room插入无主键数据的问题解决
先修正DAO的核心错误
你的DAO插入方法参数是SomeClass,但Room仅支持插入标注@Entity的实体类(也就是你的SomeEntity),直接传SomeClass会触发Room报错,这是首要需要修正的点。
关于自增主键的处理
你提到的@AutoGenerate对应Room的@PrimaryKey(autoGenerate = true)注解,它完全可以解决你没有id字段的问题:
- 修改
SomeEntity的主键定义,去掉@Entity中的primaryKeys配置,直接给id字段加自增注解:@Entity(tableName = "someEntity") data class SomeEntity( @PrimaryKey(autoGenerate = true) val id: Int = 0, val someClass: SomeClass<*>? = null ) - 开启自增后,插入时无需手动设置
id值,Room会自动为新记录生成唯一的自增id。因为id默认值为0,Room会识别这个非有效主键值,自动替换为生成的id。
插入逻辑的调整
因为你只有SomeClass类型的数据,需要先将其转换为SomeEntity再插入:
// 假设你获取到了someClassData: SomeClass<*> val entity = SomeEntity(someClass = someClassData) dao.insert(entity)
可选:获取生成的自增id
如果需要拿到Room生成的id,可以修改DAO的插入方法返回值:
@Insert(onConflict = OnConflictStrategy.REPLACE) abstract fun insert(obj: SomeEntity): Long // 返回单个插入记录的id
内容的提问来源于stack exchange,提问作者Hello World
相关产品推荐
相关产品推荐

