在我的Android应用程序中,我使用房间持久性库创建了一个数据库。它包含一个名为stack
的表,其中列为stack_id
,col_1
,col_2
和stack_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是没有意义的。那么,我应该制作一个二传手还是有其他解决方案?
您正在使用具体类,因此您需要为属性提供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)
你需要搬家
@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
使属性可变。