You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android & Anko SQLite:未知列时如何查询解析行数据

动态解析未知结构表的查询结果

刚好碰到过类似的场景!要处理未知列结构的表,确实不能用依赖实体类的classParser,我们可以自己实现一个通用的Map类型RowParser,把每行数据转成键为列名、值为对应数据的Map,这样就能灵活遍历处理了。

第一步:实现通用的Map RowParser

我们可以利用SQLDelight提供的Row对象的metadata属性,动态获取当前结果集的所有列名,然后把列名和对应的值关联成Map:

val dynamicMapParser = RowParser { row ->
    // 从Row的元数据中提取所有列名
    val columnNames = row.metadata.columns.map { it.name }
    // 将列名与对应行数据关联成Map
    columnNames.associateWith { columnName -> row[columnName] }
}

第二步:用这个Parser执行查询

接下来就可以用这个自定义Parser来执行你的查询,得到一个包含每行键值对的List:

val rows = context.database.use {
    select("any_table").exec {
        parseList(dynamicMapParser)
    }
}

执行后rows的类型是List<Map<String, Any?>>,每个Map对应一行数据,键是表的列名,值是该行对应列的实际数据。

第三步:遍历处理每行数据

现在你可以自由遍历每行的Map,根据业务需求处理数据了,比如打印所有列名和值:

rows.forEach { rowData ->
    println("===== 处理新行 =====")
    rowData.forEach { (columnName, value) ->
        println("列名: $columnName, 数据值: $value")
        // 在这里添加你的业务逻辑,比如根据列名做不同处理,或者转换数据类型
        // 示例:如果是字符串类型就做额外处理
        if (value is String) {
            // do something with string value
        }
    }
}

一些额外提示

  • 因为row[columnName]返回的是Any?,如果需要特定类型的数据,可以用类型安全转换(比如value as? Int)或者when表达式判断类型后处理。
  • 如果需要处理空值,可以在转换时添加空值判断逻辑,比如row[columnName] ?: "默认值"。

内容的提问来源于stack exchange,提问作者Mr. B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:55:45