Room database.withTransaction { } 块未解决

Fan*_*dez 2 android android-room remote-mediator

我正在遵循有关 RemoteMediator 的教程database.withTransaction{},一切都很好,直到我在使用允许数据库操作时遇到奇怪的错误。

在此输入图像描述

不幸的是,IDE 似乎没有(或拒绝)识别这个非常真实和合法的块。我已检查是否正确定义了 ROOM 数据库抽象类,并在 build.gradle(app) 文件中声明了这些 ROOM 和 Paging 3 库。

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

    // Room-paging artifact
    implementation 'androidx.room:room-paging:2.4.3'

    // Paging 3.0
    implementation 'androidx.paging:paging-compose:1.0.0-alpha16'
Run Code Online (Sandbox Code Playgroud)

因此,我决定忽略该错误并继续调用块dao内的函数withTransaction{},但我得到Suspension functions can be call only inside a coroutine body

这有点令人困惑,因为 RemoteMediator 的load()覆盖函数已经是一个挂起函数

任何对这个问题有见解的人请帮忙,因为我似乎没有解决这个问题。

Fan*_*dez 6

感谢上面的@ianhanniballake节省时间的评论,如果您遇到这种情况,只需将房间运行时风格更改为:

implementation "androidx.room:room-runtime:2.4.3"
kapt "androidx.room:room-compiler:2.4.3"
Run Code Online (Sandbox Code Playgroud)

room -ktx风格:

implementation "androidx.room:room-ktx:2.4.3"
kapt "androidx.room:room-compiler:2.4.3"
Run Code Online (Sandbox Code Playgroud)

根据开发人员文档, ktx-libs 提供 Kotlin 扩展和协程支持,这正是 block 的含义database.withTransaction{}- 它是 RoomDatabase 上的扩展函数,如源代码中的这一行所示。

public suspend fun <R> RoomDatabase.withTransaction(block: suspend () -> R): R {
Run Code Online (Sandbox Code Playgroud)

Android KTX 是一组 Kotlin 扩展,包含在 Android Jetpack 和其他 Android 库中。KTX 扩展为 Jetpack、Android 平台和其他 API 提供简洁、惯用的 Kotlin。为此,这些扩展利用了多项 Kotlin 语言功能,包括以下功能:

  • 扩展功能
  • 扩展属性
  • 拉姆达斯
  • 命名参数
  • 参数默认值
  • 协程