Android Room 数据库忽略问题“尝试了以下构造函数,但它们无法匹配”

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

我的实体类:

@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).
android android-room android-jetpack android-database
2个回答
5
投票

由于 Room 在编译期间仍然生成 Java 类,并且问题出在默认值参数上,因此尝试使用 @JvmOverloads 作为构造函数:

@Entity(tableName = "student")
data class Student @JvmOverloads constructor(
    var name: String,
    .....  

更新

有趣的是,在文档中没有提及对这种情况的特殊处理。并且这个问题已经存在,可以修复此文档。

这个问题至于问题本身的结论是:

使用 @JvmOverloads 应该可以。在不远的将来有一天,我们可能会生成 Kotlin,这将不再是问题


0
投票

我有一个名为“private”的布尔属性并收到此错误。 Private 不是 Java/Kotlin 中的保留变量字,但似乎在类生成过程中私有变量被删除,因此出现构造函数错误。我不明白为什么 Room 会在没有警告的情况下删除这样的变量。

如果出现此错误,请将数据类中的值与发生错误的 Build 文件夹下的值进行比较。 Android Studio 将提供一个 错误文本中问题类文件的链接。您可能会发现缺少一个,并且您知道 Room 不希望您使用该名称的变量。

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