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.
相关产品推荐
相关产品推荐

