如何在 Kotlin 协程中使用 Sqldelight

Jac*_*s.S 3 android kotlin sqldelight kotlin-coroutines

SqlDelight 显然有 Kotlin 协程扩展函数,但我不知道如何实现它们,因为我找不到文档。

我有一个看起来像这样的普通查询:

val allItems
  get() = itemQueries.selectAll().mapToList()
Run Code Online (Sandbox Code Playgroud)

我可以把它变成挂起功能吗?

Jac*_*s.S 6

目前 (v1.2.1) 没有对 SqlDelight 查询的挂起函数支持,但是您可以使用 Coroutines Flow 对象,这更好。为此,您需要在应用程序 gradle 中添加协程扩展库:

dependencies {
  implementation "com.squareup.sqldelight:coroutines-extensions:1.2.1"
}
Run Code Online (Sandbox Code Playgroud)

然后把你的查询变成这样:

val allItems: Flow<List<Item>> = 
  itemQueries.selectAll()
    .asFlow()
    .mapToList()
Run Code Online (Sandbox Code Playgroud)

此流程发出查询结果,并在每次针对该查询更改数据库时发出新结果。

然后您可以.collect{}在协程范围内获得结果。

  • 除了这个针对多平台项目的出色答案之外:在 commonMain 中添加依赖项并使用最新的 lib 版本(当前为 1.3.0)`commonMain.dependencies {implementation ....}` (2认同)

Mar*_*ark 6

对于单次查询,您不需要协程扩展库。相反,只需执行以下操作:

suspend fun getAllItems() = withContext(Dispatchers.IO) {
    itemQueries.selectAll().mapToList()
}
Run Code Online (Sandbox Code Playgroud)

另一个答案特定于您想要对数据库中的更改做出反应的情况。