Проблема с @Ignore и неизменяемыми полями - PullRequest
0 голосов
/ 26 марта 2019

У меня проблема с комнатой.

Я использую модификацию с Gson конвертером для остальных API, и я хотел бы поделиться pojos с комнатой. В целом это работает, но в некоторых случаях мне нужно игнорировать некоторые поля, потому что у меня есть список объектов. Я попытался использовать аннотацию @Ignore, но при ее использовании процесс сборки завершился неудачно со следующими ошибками:

ошибка: у сущностей и Pojos должен быть общедоступный конструктор. Вы может иметь пустой конструктор или конструктор, параметры которого совпадают поля (по имени и типу). Публичный выпускной класс Сервис {

^ ошибка: не удается найти установщик для поля. приватный финал java.lang.String id = null;

^ ошибка: не удается найти установщик для поля. приватный финал java.lang.String name = null;

^ ошибка: не удается найти установщик для поля. закрытый финал java.lang.String description = null;

Итак, используя этот класс, все работает:

@Entity(tableName = "services")
data class Service(

    @PrimaryKey val id: String,
    val name: String,
    val description: String,
    val parentId: String?
)

С этим не получается:

@Entity(tableName = "services")
data class Service(

    @PrimaryKey val id: String,
    val name: String,
    val description: String,
    val parentId: String?,
    @Ignore val test: String
)

Я использую эту версию комнаты:

implementation 'androidx.room:room-runtime:2.1.0-alpha06'
kapt 'androidx.room:room-compiler:2.1.0-alpha06'

Я знаю, что проблему можно решить, используя var вместо val и добавив вторичный конструктор, но я не хочу этого делать, я предпочитаю сохранять неизменное состояние моих полей.

Это ошибка аннотации игнорирования? Почему без этого все работает? Любая помощь приветствуется:)

1 Ответ

0 голосов
/ 26 марта 2019

Во втором вашем примере Service будет преобразован в класс Java, который имеет один конструктор с четырьмя параметрами. Room видит аннотации @Ignore и знает, что ему нужно связать 3 поля, и поэтому ему нужен конструктор с 3 параметрами, соответствующими этим типам полей. Поскольку он не находит такой конструктор (или конструктор по умолчанию), он терпит неудачу.

Попробуйте сделать последнее свойство необязательным и используйте аннотацию @JvmOverloads в конструкторе:

@Entity(tableName = "services")
data class Service @JvmOverloads constructor(
    @PrimaryKey val id: String,
    val name: String,
    val description: String,
    val parentId: String?,
    @Ignore val test: String? = null
)

Это заставит компилятор Kotlin сгенерировать конструктор с 3 параметрами и снова сделает Room счастливым.

Я использую модификацию с Gson конвертером для остальных API, и я хотел бы разделить пижо с комнатой.

Вероятно, вам следует избегать этого и использовать два набора классов для моделирования ответа API и данных базы данных. Даже в этот начальный момент вам нужно сделать несколько «взломов», чтобы все работало, если в будущем изменения API или базы данных вам понадобятся в более сложных местах.

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