Android Room Database忽略问题“尝试了以下构造函数,但它们不匹配" [英] Android Room Database Ignore Problem "Tried the following constructors but they failed to match"

查看:65
本文介绍了Android Room Database忽略问题“尝试了以下构造函数,但它们不匹配"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的实体类别:

@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 中测试):

And then I insert like this (tested in androidTest):

val student = Student("Sam", 27, 3.5, true)

studentDao.insert(student)

在添加 @Ignore 批注之后,它立即给我这个错误:

It gives me this error right after I added the @Ignore annotation:

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类,并且问题在于默认值参数,因此请尝试使用

Since Room still generates Java-classes during compile and the problem is with default-valued parameter, try to use @JvmOverloads for constructor:

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

更新

有趣的是,此处为文档没有提及这种情况的特殊待遇.并且此问题已存在,可以修复此文档.

It's interesting that here in documentation there is no mentioning of special treatment to this case. And this issue already exists to fix this documentation.

来自此问题,该问题本身的结论是:

From this issue as for the problem itself conclusion is:

使用@JvmOverloads应该可以.在不那么遥远的将来的某一天,我们可能会生成Kotlin,这不会成为问题

Using @JvmOverloads should work. One day in the not-so-distant future we might generate Kotlin and this won't be an issue

这篇关于Android Room Database忽略问题“尝试了以下构造函数,但它们不匹配"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆