【问题标题】:GRDB in Swift - .fetchAll Only Ever Returns One ColumnSwift 中的 GRDB - .fetchAll 只返回一列
【发布时间】:2019-12-15 19:49:21
【问题描述】:

我的原始代码

func getUserByEmpNum(_ id: Int) -> String {
    let nameQuery: String = "SELECT fld_str_firstname, fld_str_lastName FROM userView WHERE fld_int_id = \(id);"

    var returnStr = ""
    do {
        let dbQueue = try DatabaseQueue(path: MYCDatabase.pathToDatabase)
        try dbQueue.inTransaction(.none) { (db) -> Database.TransactionCompletion in
            let returnStrs = try String.fetchAll(db, sql: nameQuery)
            // Placing a breakpoint here, returnStrs only has one element?
            return .commit
        }
    } catch {
        print (error)
    }

    return returnStr
}

我的问题

在这段代码中,如果我执行select fld_str_firstname from myOwnUserView where fld_int_id = 2; 之类的查询,我会在 returnStrs 数组中得到一个元素,这与预期的一样。然后选择这两个字段,就像在 nameQuery 中一样,我仍然只能在 returnStrs 数组中得到一个字符串。

为什么会这样,我如何适应它以获取响应中的所有选定列?

【问题讨论】:

  • 邮政编码作为文本,而不是图像。你能打印变量 returnStrs 并包含结果吗?
  • 直接在您的数据库上运行查询,使用sqlite3。它返回什么?
  • 帖子应尽可能独立。不要依赖指向外部网站的链接来获取帖子本身可能包含、引用或解释的内容。不要将文本图像(例如屏幕截图或打印页面的扫描)用于可以直接输入帖子的材料; meta.stackoverflow.com/a/346503/1180728
  • 伙计们,我已经根据 cmets 进行了更正。请停止投票我原来的问题。

标签: swift grdb


【解决方案1】:

String.fetchAll 返回从最左侧选定列中提取的字符串数组,如documented。每个提取的行一个字符串。每个选定的列没有一个字符串。

如果您想从多个列中获取字符串,请使用Row.fetchAll,它返回一个数据库行数组。从这些行中,您可以提取您感兴趣的每一列:

let rows = try Row.fetchAll(db, sql: "SELECT fld_str_firstname, fld_str_lastName FROM ...")
for row in rows {
    let firstName: String = row["fld_str_firstname"]
    let lastName: String = row["fld_str_lastName"]
}

有关从数据库行中提取值的更多信息,请参阅文档的 this chapter

由于您是从以其 id 标识的单行中读取名称,因此您可能更喜欢 fetchOne 方法,该方法使用单个数据库行(请参阅 Fetching Methods):

if let row = try Row.fetchOne(db, sql: "SELECT ... WHERE fld_int_id = ?", arguments: [id]) {
    let firstName: String = row["fld_str_firstname"]
    let lastName: String = row["fld_str_lastName"]
    // Use first and last name 
} else {
    // ID does not exist in the database: do what is appropriate.
}

【讨论】:

    猜你喜欢
    • 2012-12-21
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    相关资源
    最近更新 更多