Я пытаюсь реализовать библиотеку Room Persistent Database
в проекте android kotlin, но ловлю это предупреждение во время компиляции. Я не знаю, как решить эту борьбу.
предупреждение: есть несколько хороших конструкторов, и Room выберет конструктор без аргументов. Вы можете использовать аннотацию @Ignore для удаления ненужных конструкторов.
Авто сгенерированный класс
public final class Gender {
^
Класс данных Kotlin
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 = "")
Проблема в том, что 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
)
Попробуй это:
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, "")
}
Как говорится в предупреждении
(...) Комната выберет конструктор без аргументов. (...)
Ваш конструктор имеет два аргумента. Вам нужно было добавить пустой и игнорировать другой