Невозможно найти сеттер для поля – используя базу данных Kotlin с комнатой

Я интегрирую библиотеку с сохранением комнаты. У меня есть класс данных в Kotlin:

@Entity(tableName = "story") data class Story ( @PrimaryKey val id: Long, val by: String, val descendants: Int, val score: Int, val time: Long, val title: String, val type: String, val url: String ) 

@Entity и @PrimaryKey предназначены для библиотеки Room. Когда я пытаюсь построить, он терпит неудачу:

 Error:Cannot find setter for field. Error:Execution failed for task ':app:compileDebugJavaWithJavac'. > Compilation failed; see the compiler error output for details. 

Я также попытался предоставить конструктор по умолчанию:

 @Entity(tableName = "story") data class Story ( @PrimaryKey val id: Long, val by: String, val descendants: Int, val score: Int, val time: Long, val title: String, val type: String, val url: String ) { constructor() : this(0, "", 0, 0, 0, "", "", "") } 

Но это не работает. Следует отметить, что он работает, если я конвертирую этот класс Kotlin в класс Java с помощью геттеров и сеттеров. Любая помощь приветствуется!

Поскольку ваши поля отмечены значком val , они фактически являются окончательными и не имеют полей настройки.

Попробуйте отключить val с var . Вам также может потребоваться инициализировать поля.

 @Entity(tableName = "story") data class Story ( @PrimaryKey var id: Long? = null, var by: String = "", var descendants: Int = 0, var score: Int = 0, var time: Long = 0L, var title: String = "", var type: String = "", var url: String = "" ) 

Другой причиной этого может быть именование поля. Если вы используете какой-либо из предопределенных ключевых слов, вы получите ту же ошибку. Например, вы не можете назвать свой столбец «is_active».

Ссылка: http://www.sqlite.org/lang_keywords.html

Была ли эта ошибка в Java. Вам либо нужно передать поле в конструкторе, либо инициализировать его аргументом конструктора, либо создать для него сеттер.

Пример:

 public MyEntity(String name, ...) { this.name = name; ... } public void setName(String name) { this.name = name; } 

Эй, я не знаю, знают ли все или нет, но у вас нет колонки, которая начинается с Room . Например, у вас не может быть этого

  @Entity(tableName = "user") data class User ( @PrimaryKey var id: Long? = null, var userName: String = "", var isConnectedToFB: Boolean = false, )