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

如何在Android Room数据库中创建并插入新记录?

解决Room Entity自动生成主键时创建实例的参数问题

你的问题核心是Kotlin数据类的语法要求和Room自动生成主键逻辑的差异:Room的autoGenerate = true仅负责插入数据时自动生成主键值,但Kotlin数据类的主构造函数要求所有参数必须有值(除非设置默认值),所以你必须给uid参数提供默认值,才能在创建实例时省略它。

修改Entity定义

给uid参数添加默认值0,Room在插入时会自动忽略这个默认值,生成正确的自增主键:

@Entity
data class Shader(
    @PrimaryKey(autoGenerate = true) val uid: Int = 0,
    val name: String,
    val shaderMainText: String,
    val paramsJson: String?
)

创建并插入新记录

现在可以正常创建Shader实例(无需传入uid),再调用Dao的插入方法即可:

// 创建新记录
val newShader = Shader(
    name = "Foo",
    shaderMainText = "bar",
    paramsJson = null
)

// 插入记录(注意:Room数据库操作不能在主线程执行,需用协程或线程池)
CoroutineScope(Dispatchers.IO).launch {
    yourShaderDao.insertAll(newShader)
}

补充说明

  • 当autoGenerate = true时,SQLite会自动维护自增主键序列,即使传入uid=0,Room也会替换为正确的自增值(通常从1开始递增)。
  • 若要更明确区分“新记录”和“已有记录”,也可将uid设为Int? = null,但使用0作为默认值是更通用的做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:50:26