Интерфейс DAO для Android не работает с наследованием - PullRequest
0 голосов
/ 10 октября 2018
interface Marker<T : BaseFoo> {
    fun getSpecialFoo(): List<T>
}

@Dao
interface FooDao: Marker<Foo> {
    @Query("SELECT * FROM foo WHERE bar = :bar")
    fun get(bar: Int): List<Foo>

    @Transaction
    override fun getSpecialFoo(): List<Foo> {
        return get(1)
    }
}

Это приводит к

Абстрактный метод DAO должен быть аннотирован одной и только одной из следующих аннотаций: Вставить, Удалить, Запрос, Обновить, RawQuery

Однако Marker не помечено @Dao и FooDao уже переопределяет getSpecialFoo.Почему эта ошибка все еще отображается?

Мне нужен Marker, потому что мне нужен универсальный DAO, который имеет несколько методов.Есть ли способ обойти это?

Единственный способ, которым я могу придумать, это пометить дао на Any и привести тип времени выполнения или создать оболочку для DAO.

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Вы можете решить эту проблему.

Проблема не в ограничениях комнаты, а в самой реализации kotlin.Вы используете универсальный метод сбора, который по умолчанию обрабатывается до List<? extends T> реализации Java, но переопределенный метод имеет List<Foo> возвращаемый тип.Генератор помещений соответствует сигнатуре метода и не может найти реализованный метод с такой же сигнатурой, поэтому вы получите

abstract Метод DAO должен быть аннотирован одной и только одной из следующих аннотаций

Решение - просто аннотировать параметр метода в интерфейсе с @JvmSuppressWildcards:

fun getSpecialFoo(): List<@JvmSuppressWildcards T>

0 голосов
/ 04 декабря 2018

Похоже, что это ограничение библиотеки комнаты.Вы можете обойти это следующим образом.

@Dao
interface FooDao {
    @Query("SELECT * FROM foo WHERE bar = :bar")
    fun get(bar: Int): List<Foo>

    @Transaction
    fun getSpecialFoo(): List<Foo> {
        return get(1)
    }
}

fun FooDao.wrapper(): Marker<Foo> {
    return Wrapper(this)
}


private class Wrapper(private val dao: FooDao): Marker<Foo> {
    override fun getSpecialFoo() = dao.getSpecialFoo()
}

Когда вам нужно, чтобы оно было Marker<Foo>, вы можете wrapper() создать оболочку, которая реализует Marker<Foo> с помощью dao.

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