swift - Swift 中的 GRDB - .fetchAll 只返回一列
问题描述
我的原始代码
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 数组中得到一个字符串。
为什么会这样,我如何适应它以获取响应中的所有选定列?
解决方案
String.fetchAll
返回从最左侧选定列中提取的字符串数组,如文档所示。每个提取的行一个字符串。每个选定的列没有一个字符串。
如果您想从多列中获取字符串,请使用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"]
}
有关从数据库行中提取值的更多信息,请参阅文档的这一章。
由于您正在从以其 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.
}
推荐阅读
- swagger - 当我们在 OpenAPI POST 端点的请求正文(JSON)中传递额外字段时会发生什么
- c - “错误:在创建共享对象时无法使用针对 `.text' 的重定位 R_X86_64_32S”,同时创建动态库
- java - LinkedList Implementation Java - get(int index) - Explain what this code does
- python - 如何审查 Django 博客评论中的单词?
- asp.net - AspNet Visual Studio - 合并程序集时出错
- c++ - 如何为 Boost.Locale 中的数字指定自定义小数分隔符?
- azure-ad-b2c - 可以在忘记密码的链接上禁用 &hint= 吗?
- python - 从其他列的值中过滤列值并将结果转换为多个列表 Pandas
- reactjs - 什么样的身份验证流 react-aad-msal 使用
- marklogic - Marklogic Java 客户端 API 标准不起作用