如何在 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 协程协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 )
深入理解Kotlin协程协程中的Channel和Flow & 协程中的线程安全问题
Kotlin 协程协程中的多路复用技术 ② ( select 函数原型 | SelectClauseN 事件 | 查看挂起函数是否支持 select )