Ошибка компиляции комнаты Android: функция приостановки @Transaction - PullRequest
0 голосов
/ 03 июня 2019

У меня проблемы с функцией приостановки в Room @Transaction

Версии:

room_version = "2.1.0-alpha04"
implementation "androidx.room:room-runtime:$room_version"
implementation "androidx.room:room-coroutines:$room_version"
kapt "androidx.room:room-compiler:$room_version"

Я также пробовал с 2.1.0-rc01.

Kotlin: 1,3

Это мой интерфейс DAO:

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(sifrBl: SifrBl)

@Query("DELETE FROM sifrbl")
suspend fun deleteAll()

@Transaction
suspend fun setSifrBl(sifrBl: SifrBl){
    deleteAll()
    insert(sifrBl)
}

При компиляции я получаю следующую ошибку:

Method annotated with @Transaction must not return deferred/async return type androidx.lifecycle.LiveData. Since transactions are thread confined and Room cannot guarantee that all queries in the method implementation are performed on the same thread, only synchronous @Transaction implemented methods are allowed. If a transaction is started and a change of thread is done and waited upon then a database deadlock can occur if the additional thread attempts to perform a query. This restrictions prevents such situation from occurring.

Я имею в видуна это

Если я удаляю приостановку во всех функциях, то это работает.

Любая помощь приветствуется:)

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Что-то не так с зависимостями.

room_version = "2.1.0-rc01"

    //Room
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"

// optional - Kotlin Extensions and Coroutines support for Room
implementation "androidx.room:room-ktx:$room_version"

// Test helpers
testImplementation "androidx.room:room-testing:$room_version"

Теперь это работает.

0 голосов
/ 03 июня 2019

Посмотрев на исходный код процессора аннотаций, я могу сказать, что данный код не может выдать указанную ошибку, поскольку он будет срабатывать только в том случае, если метод возвращает объект LiveData<*>.( reference )

Для справки любой метод @Transaction, который каким-либо образом возвращает объект LiveData, объект RxJava или объект ListenableFuture Гуавы, вызовет это исключение, поскольку они могутвызвать мутации после возвращения из метода.Обратите внимание, что это черный список, и любой объект, который откладывает выполнение, будет в равной степени проблематичным, но не вызовет ошибку.

...