Android Room Entity логический с DAO: Kotlin против Java - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь перенести некоторые из моих классов Android Java POJO в Kotlin.Некоторые из этих классов используются в качестве объекта Room.

В соответствии с документацией для Определение данных с использованием объектов Room , методы получения и установки должны быть названы в соглашении JavaBean.

Если вы используете методы получения и установки, имейте в виду, что они основаны на соглашениях JavaBeans в Room.

С JavaBeans и логическим полем, это должно быть так в Java

@Entity
public class MyObject {
    // other stuff
    public MyObject() {
        this.enabled = false;
    }

    public boolean isEnabled() { return this.enabled; }
    public void setEnabled(boolean enabled) { this.enabled = enabled; }
}

Теперь в DAO на это можно ссылаться как таковое enabled = 1

@Query("select * from myobject where enabled = 1")
public List<MyObject> loadEnabledObjects();

В Котлине объект сводится к этому

@Entity
class MyObject {
    // other stuff
    var isEnabled: Boolean = false
}

Когдапри использовании DAO, как и раньше, возникает ошибка времени компиляции

ошибка: существует проблема с запросом: [SQLITE_ERROR] Ошибка SQL или отсутствует база данных (такой столбец не включен)

Похоже, что сущность Room ведет себя по-разному в моей версии Kotlin, и чтобы ссылаться на версию Kotlin с DAO, я должен изменить запрос, чтобы использовать isEnabled = 1

@Query("select * from myobject where isEnabled = 1")
public List<MyObject> loadEnabledObjects();

Официальный Kotlin Examples для Определение данных с использованием сущностей Room , и я хочу убедиться, что это правильное поведение, прежде чем я изменю все свои DAO.

Это правильно, или я что-то упустил сKotlin Entity такие аннотации или другая схема именования?

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

После проверки сгенерированного Байт-кода этот код Kotlin

var isEnabled: Boolean

Создает следующие методы

public Boolean isEnabled();
public void setEnabled();

Для того, чтобы сделать это в Kotlin и использовать их в DAO, сохраняя JavaBeanПо соглашению, в запросе необходимо использовать isEnabled

@Query("select * from myobject where isEnabled = 1")
public List<MyObject> loadEnabledObjects();

Я до сих пор не уверен, почему DAO не будет работать с тем же синтаксисом запроса в Kotlin, что и в Java, так как они оба имеют одинаковые методы и сигнатуры,Поскольку весь мой код основан на соглашении JavaBean, я только что изменил запросы.


Просто для добавления заметок я наткнулся на проверку сгенерированного байт-кода, этот код Котлина

var enabled: Boolean

Генерирует эти методы

public Boolean getEnabled();
public void setEnabled();
0 голосов
/ 06 октября 2018

Хм, я думаю, что метод get is автоматически создается для логического значения в JavaBeans.

Итак, вы должны просто сделать вашу переменную «включенной».

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

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