Почему я должен сделать установщик для автоинкрементного столбца в базе данных? - PullRequest
1 голос
/ 05 апреля 2019

В моем приложении для 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? Я нашел это решение, чтобы установить en автоматически увеличенный столбец в 0, и оно будет автоматически автоматически увеличивать значение, но это не имеет смысла для меня. Так это правильно?

Вопрос 2: Когда я хочу собрать приложение, оно выдает ошибку: Cannot find setter for field. private final int stackId = 0; Но было бы бессмысленно делать установщик для автоматически увеличиваемого значения. Итак, я должен сделать сеттер или есть другое решение?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019

Вы используете конкретный класс, поэтому вам нужно предоставить 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 голос
/ 05 апреля 2019

Вам нужно переместить

@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, поэтому оно является окончательным / неизменным, но присваивание в конструкторе является значением по умолчанию, которое можно переопределить, передав значение.

Однако в вашем примере свойство находится в теле классаи ему присваивается значение 0 в init, и его нельзя изменить, так как свойство является неизменным.Второй вариант, как указано, делает свойство изменяемым, используя var вместо val.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...