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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:11:43