【发布时间】:2020-06-07 03:16:51
【问题描述】:
显然有 SqlDelight 的 Kotlin 协程扩展函数,但我不知道如何实现它们,因为我找不到文档。
我有一个看起来像这样的普通查询:
val allItems
get() = itemQueries.selectAll().mapToList()
我可以把它变成一个挂起函数吗?
【问题讨论】:
标签: android kotlin kotlin-coroutines sqldelight
显然有 SqlDelight 的 Kotlin 协程扩展函数,但我不知道如何实现它们,因为我找不到文档。
我有一个看起来像这样的普通查询:
val allItems
get() = itemQueries.selectAll().mapToList()
我可以把它变成一个挂起函数吗?
【问题讨论】:
标签: android kotlin kotlin-coroutines sqldelight
目前 (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.dependencies { implementation ....}
对于单次查询,您不需要协程扩展库。相反,只需这样做:
suspend fun getAllItems() = withContext(Dispatchers.IO) {
itemQueries.selectAll().mapToList()
}
other 的答案特定于您想要对数据库中的更改做出反应的时间。
【讨论】: