在我看来,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 ->
…
}