在SQLite Swift documentation中,引用了直接获取语句结果。我准备了很多SQL查询,我真的不想重构它们。我会更快地使用它们,因为它们正在使用db.prepare,如下所示。
结果的陈述可能会被重复。
let stmt = try db.prepare("SELECT id, email FROM users")
for row in stmt {
print("id: \(row[0]), email: \(row[1])")
// id: Optional(1), email: Optional("alice@mac.com")
}
返回值始终具有“Optional()”。有没有办法我们可以在没有这个的情况下获得原始行值?
答案 0 :(得分:1)
在变量之后使用!
展开值@stephencelis说:
let stmt = try db.prepare("SELECT id, email FROM users")
for row in stmt {
print("id: \(row[0]!), email: \(row[1]!)")
}
答案 1 :(得分:1)
您可能想要使用https://github.com/groue/GRDB.swift。它允许您按照自己的意愿提取选项或非选项:
for row in Row.fetch(db, "SELECT id, email FROM users") {
let id: Int64 = row.value(atIndex: 0)
let email: String = row.value(atIndex: 1)
print(id, email)
}
答案 2 :(得分:0)
类型安全的API允许您声明非可选类型的表达式,这些表达式在从语句中拉回时不会被包装。
来自自述文件:
let users = Table("users")
let id = Expression<Int64>("id")
let name = Expression<String?>("name")
let email = Expression<String>("email")
try db.run(users.create { t in
t.column(id, primaryKey: true)
t.column(name)
t.column(email, unique: true)
})
// CREATE TABLE "users" (
// "id" INTEGER PRIMARY KEY NOT NULL,
// "name" TEXT,
// "email" TEXT NOT NULL UNIQUE
// )
let insert = users.insert(name <- "Alice", email <- "alice@mac.com")
let rowid = try db.run(insert)
// INSERT INTO "users" ("name", "email") VALUES ('Alice', 'alice@mac.com')
for user in db.prepare(users) {
println("id: \(user[id]), name: \(user[name]), email: \(user[email])")
// id: 1, name: Optional("Alice"), email: alice@mac.com
}
请注意,id
和email
都是非可选的,都是这样返回的。