Android房间数据库忽略问题"Tried the following constructors but they failed to match"
Android Room Database Ignore Problem "Tried the following constructors but they failed to match"
我的实体class:
@Entity(tableName = "student")
data class Student(
var name: String,
var age: Int,
var gpa: Double,
var isSingle: Boolean,
@PrimaryKey(autoGenerate = true)
var id: Long = 0,
@Ignore //don't create column in database, just for run time use
var isSelected: Boolean = false
)
然后我像这样插入(在androidTest
中测试):
val student = Student("Sam", 27, 3.5, true)
studentDao.insert(student)
在我添加 @Ignore
注释后立即出现此错误:
C:\Android Project\RoomTest\app\build\tmp\kapt3\stubs\debug\com\example\roomtest\database\Student.java:7: ����: Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type).
public final class Student {
^
Tried the following constructors but they failed to match:
Student(java.lang.String,int,double,boolean,boolean,long) -> [param:name ->
matched field:name, param:age -> matched field:age, param:gpa -> matched
field:gpa, param:isSingle -> matched field:isSingle, param:isSelected ->
matched field:unmatched, param:id -> matched field:id][WARN] Incremental
annotation processing requested, but support is disabled because the
following processors are not incremental: androidx.room.RoomProcessor
(DYNAMIC).
由于 Room 在编译期间仍会生成 Java-classes,问题出在 default-valued 参数上,请尝试对构造函数使用 @JvmOverloads:
@Entity(tableName = "student")
data class Student @JvmOverloads constructor(
var name: String,
.....
更新
有趣的是 here in documentation there is no mentioning of special treatment to this case. And this issue 已经存在以修复此文档。
来自this issue至于问题本身的结论是:
Using @JvmOverloads should work. One day in the not-so-distant future we might generate Kotlin and this won't be an issue
我的实体class:
@Entity(tableName = "student")
data class Student(
var name: String,
var age: Int,
var gpa: Double,
var isSingle: Boolean,
@PrimaryKey(autoGenerate = true)
var id: Long = 0,
@Ignore //don't create column in database, just for run time use
var isSelected: Boolean = false
)
然后我像这样插入(在androidTest
中测试):
val student = Student("Sam", 27, 3.5, true)
studentDao.insert(student)
在我添加 @Ignore
注释后立即出现此错误:
C:\Android Project\RoomTest\app\build\tmp\kapt3\stubs\debug\com\example\roomtest\database\Student.java:7: ����: Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type).
public final class Student {
^
Tried the following constructors but they failed to match:
Student(java.lang.String,int,double,boolean,boolean,long) -> [param:name ->
matched field:name, param:age -> matched field:age, param:gpa -> matched
field:gpa, param:isSingle -> matched field:isSingle, param:isSelected ->
matched field:unmatched, param:id -> matched field:id][WARN] Incremental
annotation processing requested, but support is disabled because the
following processors are not incremental: androidx.room.RoomProcessor
(DYNAMIC).
由于 Room 在编译期间仍会生成 Java-classes,问题出在 default-valued 参数上,请尝试对构造函数使用 @JvmOverloads:
@Entity(tableName = "student")
data class Student @JvmOverloads constructor(
var name: String,
.....
更新
有趣的是 here in documentation there is no mentioning of special treatment to this case. And this issue 已经存在以修复此文档。
来自this issue至于问题本身的结论是:
Using @JvmOverloads should work. One day in the not-so-distant future we might generate Kotlin and this won't be an issue