有多个好的构造函数,Room将选择no-arg构造函数。如何解决这个警告

时间:2018-10-25 07:12:04

标签: android constructor kotlin android-room

我尝试在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 = "")

3 个答案:

答案 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
)