如何在 Kotlin 协程中使用 Sqldelight

Posted

技术标签:

【中文标题】如何在 Kotlin 协程中使用 Sqldelight【英文标题】:How to use Sqldelight with Kotlin Coroutines 【发布时间】:2020-06-07 03:16:51 【问题描述】:

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

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

val allItems
  get() = itemQueries.selectAll().mapToList()

我可以把它变成一个挂起函数吗?

【问题讨论】:

【参考方案1】:

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

dependencies 
  implementation "com.squareup.sqldelight:coroutines-extensions:1.2.1"

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

val allItems: Flow<List<Item>> = 
  itemQueries.selectAll()
    .asFlow()
    .mapToList()

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

然后您可以.collect 协程范围内的结果。

【讨论】:

为多平台项目添加这个出色的答案:在 commonMain 中添加依赖项并使用最新的 lib 版本(当前为 1.3.0)commonMain.dependencies implementation .... 官方文档:cashapp.github.io/sqldelight/multiplatform_sqlite/coroutines【参考方案2】:

对于单次查询,您不需要协程扩展库。相反,只需这样做:

suspend fun getAllItems() = withContext(Dispatchers.IO) 
    itemQueries.selectAll().mapToList()

other 的答案特定于您想要对数据库中的更改做出反应的时间。

【讨论】:

以上是关于如何在 Kotlin 协程中使用 Sqldelight的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )

kotlin协程的理解

Kotlin 协程协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 )

Kotlin 协程中的挂起函数是啥意思?

深入理解Kotlin协程协程中的Channel和Flow & 协程中的线程安全问题

Kotlin 协程协程中的多路复用技术 ② ( select 函数原型 | SelectClauseN 事件 | 查看挂起函数是否支持 select )