为什么我必须为数据库中的自动递增列创建一个setter?

问题描述 投票:1回答:2

在我的Android应用程序中,我使用房间持久性库创建了一个数据库。它包含一个名为stack的表,其中列为stack_idcol_1col_2stack_name。这是实体类的代码:

@Entity
class Stack(
    @ColumnInfo(name = "stack_name") val stackName: String,
    @ColumnInfo(name = "col_1") val column1: String,
    @ColumnInfo(name = "col_2") val column2: String
) {
    @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "stack_id") val 
stackId: Int = 0
}

问题1:stack_id是否正确实现?我找到了这个解决方案,将自动递增的列设置为0,它会自动自动递增值,但这对我没有意义。那么,这是正确的吗?

问题2:当我想构建应用程序时,它会抛出错误:Cannot find setter for field. private final int stackId = 0;但是为自动递增的值创建一个setter是没有意义的。那么,我应该制作一个二传手还是有其他解决方案?

android kotlin android-room
2个回答
2
投票

您正在使用具体类,因此您需要为属性提供get()和set()。使用仅为此目的构建的数据类。

  @Entity
data class Stack(
        @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "stack_id") val id: Int? = null,
        @ColumnInfo(name = "stack_name") val stackName: String,
        @ColumnInfo(name = "col_1") val column1: String,
        @ColumnInfo(name = "col_2") val column2: String)

1
投票

你需要搬家

@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "stack_id") val 
stackId: Int = 0

到构造函数。

@Entity
class Stack(
    @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "stack_id") val 
     stackId: Int = 0,
    @ColumnInfo(name = "stack_name") val stackName: String,
    @ColumnInfo(name = "col_1") val column1: String,
    @ColumnInfo(name = "col_2") val column2: String
)

为什么会这样?该属性是val,因此是final / immutable,但构造函数中的赋值是一个默认值,可以通过传入一个值来覆盖它。

但是在您的示例中,属性位于类主体中,并在init上分配值0,并且由于属性是不可变的,因此无法更改。正如所指出的,第二个选择是通过使用var而不是val使属性可变。

© www.soinside.com 2019 - 2024. All rights reserved.