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

Kotlin Room新增对象时ViewModel要求传入Long类型参数如何解决?

问题原因

你定义的Todo数据类主构造函数的参数顺序是itemId在前,title、description在后。虽然你给itemId设置了默认值0L,但Kotlin的默认参数规则为:如果你要跳过有默认值的参数、直接给后面的无默认值参数传值,必须显式指定参数名,否则编译器会按位置匹配参数。你现在传的两个字符串会被识别为要赋值给itemId和title,类型不匹配自然会触发报错。

解决方案

方案1(推荐,改动最小):显式指定参数名调用构造

创建对象时直接指定你传值对应的参数名,跳过有默认值的itemId即可,不需要修改现有实体类代码:

mTodoViewModel.addTodo(Todo(title = titleText, description = descriptionText))

方案2:调整主构造函数的参数顺序

把有默认值的itemId放到构造函数参数的最后,之后你原有调用代码就可以正常生效:

@Entity(tableName = "todo_list")
data class Todo(
    @ColumnInfo(name = "todo_title")
    val title: String,
    @ColumnInfo(name = "todo_description")
    val description: String,
    @PrimaryKey(autoGenerate = true)
    var itemId: Long = 0L
)

方案3:新增无ID的次级构造函数

也可以给Todo数据类新增一个只接收title和description的次级构造函数,适配现有调用逻辑:

@Entity(tableName = "todo_list")
data class Todo(
    @PrimaryKey(autoGenerate = true)
    var itemId: Long = 0L,
    @ColumnInfo(name = "todo_title")
    val title: String,
    @ColumnInfo(name = "todo_description")
    val description: String
) {
    constructor(title: String, description: String) : this(0L, title, description)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:06:02