Swift 4中使用GRDB按列提取Double类型列值的方法问询
嘿,刚好对GRDB的这个用法比较熟悉!你想要同时提取两列Double数据,不用逐行手动处理的话,其实有几种简洁的方案,我给你梳理一下:
方案1:用元组数组一次性获取多列
GRDB的Row.fetchAll会返回所有查询结果的行对象,你可以把每一行映射成包含col1和col2的元组,之后再拆分出单独的数组:
import GRDB let dbQueue = DatabaseQueue(path: "你的数据库路径.sqlite") do { // 读取并映射成元组数组 let pairedValues: [(Double, Double)] = try dbQueue.read { db in try Row.fetchAll(db, sql: "SELECT col1, col2 FROM 你的表名") .map { row in // 从行中提取两列的Double值 (row["col1"] as! Double, row["col2"] as! Double) } } // 拆分出单独的列数组 let col1Values = pairedValues.map { $0.0 } let col2Values = pairedValues.map { $0.1 } // 现在就可以使用这两个数组啦 print("col1数据:\(col1Values)") print("col2数据:\(col2Values)") } catch { print("查询出错:\(error)") }
方案2:类型安全的QueryInterfaceRequest方式
如果想避免直接写SQL字符串,GRDB的查询接口(QueryInterface)能提供更好的类型安全:
import GRDB // 定义表和列 let yourTable = Table("你的表名") let col1 = Column("col1") let col2 = Column("col2") do { let pairedValues: [(Double, Double)] = try dbQueue.read { db in try yourTable.select(col1, col2) .fetchAll(db) .map { row in // 直接用列对象提取值,更安全 (row[col1], row[col2]) } } // 同样拆分出两个数组 let col1Array = pairedValues.map(\.0) let col2Array = pairedValues.map(\.1) } catch { print(error) }
优化:一次遍历填充两个数组(性能更优)
如果你的数据量比较大,不想先生成元组数组再做两次映射,可以直接在遍历行的时候同时填充两个数组,这样只需要遍历一次结果集:
import GRDB var col1Values = [Double]() var col2Values = [Double]() let dbQueue = DatabaseQueue(path: "你的数据库路径.sqlite") do { try dbQueue.read { db in let rows = try Row.fetchAll(db, sql: "SELECT col1, col2 FROM 你的表名") for row in rows { col1Values.append(row["col1"] as! Double) col2Values.append(row["col2"] as! Double) } } } catch { print("查询出错:\(error)") } // 现在col1Values和col2Values就已经填充好了
之前你只能获取单列数组,应该是用了类似fetchAll(of: Double.self, sql: "SELECT col1 FROM ...")的写法,这种API只支持单一类型的单列数据。而上面的方法都是先获取完整的行对象,再从中提取多列值,就能满足你的需求啦~
内容的提问来源于stack exchange,提问作者J. Wadia
相关产品推荐
相关产品推荐

