SQLite Swift db.prepare语句值

时间:2015-11-08 11:56:20

标签: sqlite.swift

在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()”。有没有办法我们可以在没有这个的情况下获得原始行值?

3 个答案:

答案 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
}

请注意,idemail都是非可选的,都是这样返回的。