Я пытаюсь использовать 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'
Ваша проблема заключается в том, что вы смешиваете преобразователь suspending и преобразователь Deferred. Используйте один или другой, и ваш код будет работать так, как задумано.
fun readMyObjectAsync(idMyObject: Int): Deferred<MyObject> — Лучший выбор, если вам нужно взаимодействовать/совместимость с кодом Java, поскольку для фактической работы не требуется преобразования кода.suspend fun readMyObjectAsync(idMyObject: Int): MyObject — Если вы работаете на чистом kotlin, это позволит лучше контролировать контекст, в котором он вызывается.Потратил час, пытаясь решить эту проблему. Спасибо, что помогли мне увидеть ошибку.
Это приятно знать, спасибо. Я читал, что если я отмечу свой метод DAO знаком
suspend, «по умолчанию Room будет использовать исполнитель ввода-вывода компонентов архитектуры в качестве диспетчера для выполнения операторов SQL». связь Будет ли то же самое, если я решу отказаться от ключевого слова «приостановить» и просто верну Deferred<MyObject>?