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

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

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Проблема в том, что 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 голосов
/ 25 октября 2018

Попробуйте:

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

Как и в предупреждении:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...