Использование Deferred<...> в Room DAO с сопрограммами Kotlin

Я пытаюсь использовать Coroutines с базой данных Room в проекте Android. Я почти не нашел документации в Интернете, и мне интересно, можно ли возвращать типы Deferred<> в этих методах. Что-то вроде этого:

@Dao
interface MyObjectDAO {

@Query("SELECT * FROM myObject WHERE id_myObject = :idMyObject")
suspend fun readMyObjectAsync(idMyObject: Int): Deferred<MyObject>
}

Я пробовал это, и я получаю Not sure how to convert a Cursor to this method's return type во время компиляции.

Мои зависимости:

kapt 'androidx.room:room-compiler:2.1.0-alpha04'
implementation 'androidx.room:room-runtime:2.1.0-alpha04'
implementation 'androidx.room:room-coroutines:2.1.0-alpha04'
5
0
1 229
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема заключается в том, что вы смешиваете преобразователь suspending и преобразователь Deferred. Используйте один или другой, и ваш код будет работать так, как задумано.

  • fun readMyObjectAsync(idMyObject: Int): Deferred<MyObject> — Лучший выбор, если вам нужно взаимодействовать/совместимость с кодом Java, поскольку для фактической работы не требуется преобразования кода.
  • suspend fun readMyObjectAsync(idMyObject: Int): MyObject — Если вы работаете на чистом kotlin, это позволит лучше контролировать контекст, в котором он вызывается.

Это приятно знать, спасибо. Я читал, что если я отмечу свой метод DAO знаком suspend, «по умолчанию Room будет использовать исполнитель ввода-вывода компонентов архитектуры в качестве диспетчера для выполнения операторов SQL». связь Будет ли то же самое, если я решу отказаться от ключевого слова «приостановить» и просто верну Deferred<MyObject>?

bernardo.g 02.05.2019 02:28

Потратил час, пытаясь решить эту проблему. Спасибо, что помогли мне увидеть ошибку.

flopshot 20.10.2019 20:20

Другие вопросы по теме