在我看来,SqlDelight Query object没有任何方法来逐个查询项目,而不是像executeAsList()一样作为一个整体来查询所有东西.我有一个很大的表要处理,不能将所有内容都加载到内存中.

execute()函数非常接近,因为它允许我通过映射器运行每个结果,但您失go 了类型安全性,回到了原始的SQLite列和类型转换:

val a = mDb.testQueries.selectAll().execute { cursor ->
    while (cursor.next().value) {
        println("cursor $cursor")
    }
    QueryResult.Unit
}

另一种 Select 是将映射器作为构造函数传递给查询,这样您就可以重新获得类型安全.不幸的是,这必须返回整个结果,所以返回一个与整个表一样长的列表是在浪费内存.

mDb.testQueries.selectAll { id, foo, bar, timestamp ->
    println("Running on id $id, timestamp $timestamp")
}.executeAsList()

除了编写自己的分页代码之外,真的没有其他方法可以查询大表吗?

UPDATE:基于answer的扩展函数:

    fun <RowType : Any> Query<RowType>.iterate(block: (RowType) -> Unit) {
        execute { cursor ->
            while (cursor.next().value) {
                block(mapper(cursor))
            }
            QueryResult.Unit
        }
    }
    …
    mDb.testQueries.selectAll().iterate { id, foo, bar, timestamp ->
        …
    }

推荐答案

你可以使用mapper,它是ExecutableQuery的一部分,和executeAsList一样:

val query = mDb.testQueries.selectAll()
query.execute { cursor ->
    while (cursor.next().value) {
        val typeSafeValue = query.mapper(cursor)
        // process and release
    }
    QueryResult.Unit
}

Android相关问答推荐

如何将子零部件的大小调整为可以调整大小的父组件大小?

如何在Jetpack导航中不显示目的地?

无法在Jetpack Compose中显示Admob原生广告

原因平滑滚动的滞后懒惰列在android jetpack compose

Kotlin DSL:为什么我可以从Play Store获取发布版本的日志(log)?

在不增加父行宽度的情况下添加延迟行或可滚动行

react 本机生成失败,出现异常.错误:无法确定';<;宏/>;的类型

Lateinit变量结果始终以kotlin格式未初始化

插入视图模型时,dagger 未命中绑定错误

我无法连接到信号机

弹出导航堆栈后,Compose 无法访问 Hilt View Model

SQLite Kotlin 问题 - 没有数据库

当 EditText 用于在 android studio 中将字符串发送到 firebase 时,仅允许安全调用错误

如何删除房间数据库?

为什么@PrimaryKey val id: Int? = null 在创建 Room 实体时有效吗?

从 HiltViewModel @Injection 访问 Application()

如何在一个活动中预加载图像然后在另一个活动中加载它们?

在 Kotlin 中循环遍历字符串并用新行替换句号

Kotlin 调用带参数的函数 Any is xxx ||任何 yyy 都不起作用

Сan 无法从 Firestore 获取数据,没有错误