KMP Query Data
Query Data
SELECT files live under queries/. Subdirectories become generated namespaces
and file names become generated method names.
queries/task/selectAll.sql
queries/task/selectById.sql
Basic SELECT
SELECT id, title, completed, created_at
FROM task
ORDER BY created_at DESC;
queries/task/selectAll.sql generates a KMP method under db.task:
val rows = db.task.selectAll().asList()
rows.forEach { row ->
println(row.title)
}
Parameters
Named parameters become generated params objects.
SELECT id, title, completed, created_at
FROM task
WHERE id = :id;
val task = db.task
.selectById(TaskQuery.SelectById.Params(id = 42))
.asOneOrNull()
Result Cardinality
Use the runner method that matches the expected result shape:
asList()for zero or more rows.asOne()when exactly one row must exist.asOneOrNull()when zero or one row is valid.
KMP SELECT methods expose flow APIs for reactive reads:
database.task
.selectAll()
.asFlow()
.collect { rows -> tasks = rows }