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

