2015-11-08 67 views
2

在SQLite Swift documentation中有直接獲取語句結果的參考。我準備了很多SQL查詢,我不想重構它們。我會盡早使用它們,因爲它們使用db.prepare,如下所示。SQLite Swift 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("[email protected]") 
} 

的返回值總是有 「可選()」 他們周圍。有沒有一種方法可以在沒有這個的情況下返回原始行值?

回答

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 <- "[email protected]") 
let rowid = try db.run(insert) 
// INSERT INTO "users" ("name", "email") VALUES ('Alice', '[email protected]') 

for user in db.prepare(users) { 
    println("id: \(user[id]), name: \(user[name]), email: \(user[email])") 
    // id: 1, name: Optional("Alice"), email: [email protected] 
} 

注意兩個idemail,這是不可選的,因此也返回。

+0

對不起,這不能真正回答我的問題。我真的不想要類型安全的,我希望能夠直接插入我的SQL。我很好,所有的答案輸出爲字符串,這是SQLite的默認值。 – Mark80

+0

@ Mark80由於SQLite值是在運行時動態返回的,因此非類型安全版本無法知道值的數組將會是什麼,除了可選。但是,您可以使用Swift的多種可選解包技術來處理這個問題! – stephencelis

1

展開的變量@stephencelis後使用!值說:

let stmt = try db.prepare("SELECT id, email FROM users") 
for row in stmt { 
    print("id: \(row[0]!), email: \(row[1]!)") 
} 
+0

如果我的語句是「SELECT * from users」。你知道如何獲得columnName與循環中的值? –

0

您可能需要使用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) 
} 
+0

爲什麼downvote? –