我尝试在android kotlin项目中实现Room Persistent Database
库,但在编译时收到此警告。我不知道如何解决这种冲突。
警告:有多个优秀的构造函数,Room会选择 无参数构造函数。您可以使用@Ignore注释消除 不需要的构造函数。
自动生成的类
public final class Gender {
^
科特林数据类
import android.arch.persistence.room.Entity
import android.arch.persistence.room.PrimaryKey
@Entity
data class Gender(@PrimaryKey(autoGenerate = true)
var genderId: Int = 0,
var type: String = "")
答案 0 :(得分:1)
我有同样的警告,我只是将@Ignore放在空的构造函数之前
// Empty constructor
@Ignore
public Room_Database() {
}
答案 1 :(得分:0)
尝试一下:
import android.arch.persistence.room.Entity
import android.arch.persistence.room.PrimaryKey
@Entity
class Gender @Ignore constructor(@PrimaryKey(autoGenerate = true)
var genderId: Int = 0,
var type: String = "") {
constructor() : this(0, "")
}
就像警告说的
(...)Room将选择no-arg构造函数。 (...)
您的构造函数确实有两个参数。您需要添加一个空的,而忽略另一个
答案 2 :(得分:0)
这里的“问题”是kotlin
正在为您的类生成多个构造函数,假设您对某些属性具有默认参数。
您的情况是:
// this is the synthetic one, don't worry to much about it
public Gender(int var1, String var2, int var3, DefaultConstructorMarker var4) { /* some implementation */ }
// the "default" one, that can be called when you are delegating to the default params
public Gender() { /* some implementation */ }
// the one that gets all the params
public Gender(int genderId, @NotNull String type) { /* some implementation */ }
房间可以使用不带参数的一个,也可以使用带两个参数的一个,并选择其中一个(并通过warning
告知您)
您可以删除type
的默认参数,并且将只有一个(非合成)构造函数:
// still synthetic
public Gender(int var1, String var2, int var3, DefaultConstructorMarker var4) { /* some implementation */ }
// this is the only usable constructor now
public Gender(int genderId, @NotNull String type) { /* some implementation */}
现在Room仅可以使用一个构造函数,因此它将很高兴地使用它。
如果您的用例允许,则只需删除默认值即可。请注意,您只能对非原始类型执行此操作,这会使您的API更美观。
我不知道您的特殊情况,但请注意,您也可以使用val
代替var
@Entity
data class Gender(
@PrimaryKey(autoGenerate = true)
val genderId: Int = 0, // so callers don't need to specify an id. Room will generate one if it gets a 0 here
var type: String
)