Есть несколько хороших конструкторов, и Room выберет конструктор без аргументов. Как решить это предупреждение

1

Я пытаюсь реализовать библиотеку 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
android-room
constructor

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
)
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, "")
}

Как говорится в предупреждении

(...) Комната выберет конструктор без аргументов. (...)

Ваш конструктор имеет два аргумента. Вам нужно было добавить пустой и игнорировать другой

Ещё вопросы

Сообщество Overcoder
Наверх
Меню