2016-08-15 2 views
2

SQLite.swift documentation говорит о выполнении произвольного SQL:Получение результатов из произвольных операторов SQL с правильной привязки в SQLite.swift

let stmt = try db.prepare("SELECT id, email FROM users") 
for row in stmt { 
    for (index, name) in stmt.columnNames.enumerate() { 
     print ("\(name)=\(row[index]!)") 
     // id: Optional(1), email: Optional("[email protected]") 
    } 
} 

Я хотел бы получить значения непосредственно как этот

let stmt = try db.prepare("SELECT id, email FROM users") 
for row in stmt { 
    let myInt: Int64 = row[0] // error: Cannot convert value of type 'Binding?' to specified type 'Int64' 
    let myString: String = row[1] // error: Cannot convert value of type 'Binding?' to specified type 'String' 
} 

, но ряд index имеет тип Binding?, и я не могу понять, как преобразовать его в нужный мне тип. Я вижу, что есть Statement.bind метод в source code, но я до сих пор не знаю, как его применять.

+0

ли вы попробовать используя выражение 'Expression'? (например,' let myInt: Expression = ... ') –

+0

@ l'L'l, хорошая идея. К сожалению, он дает ту же ошибку (не может преобразовать 'Binding?' В 'Expression '). Я успешно использовал 'Expression' в прошлом, но теперь, когда я пытаюсь заставить произвольный SQL работать (из-за моей проблемы с [this] (http://stackoverflow.com/q/38936230)), у меня много проблем. – Suragch

ответ

2

Вы можете получить правильно типизированных выбранные столбцы из таблицы, как это:

// The database. 
let db = try Connection(...) 

// The table. 
let users = Table("users") 

// Typed column expressions. 
let id = Expression<Int64>("id") 
let email = Expression<String>("email") 

// The query: "SELECT id, email FROM users" 
for user in try db.prepare(users.select(id, email)) { 
    let id = user[id]  // Int64 
    let mail = user[email] // String 
    print(id, mail) 
} 

альтернативой является (по выбору) закиньте Binding значения к нужному типу:

let stmt = try db.prepare("SELECT id, email FROM users") 
for row in stmt { 
    if let id = row[0] as? Int64, 
     let mail = row[1] as? String { 
     print(id, mail) 
    } 
} 
+0

Вторая часть вашего ответа решила мою проблему. Первая часть вашего ответа, безусловно, лучше для стандартного случая (и я делал это так, как раньше), но я специально задаюсь вопросом, как это сделать при выполнении произвольного SQL. (Я немного изменил свой вопрос, чтобы это отразить.) Причина, по которой я прибегаю к произвольному SQL, связана с [этой проблемой еще нерешенной проблемы] (http://stackoverflow.com/q/38936230). – Suragch

+0

Можно ли связать имена столбцов с помощью выражения «Выражение» при доступе к данным строки после произвольного запроса SQL? Я вижу ошибки, возникающие в будущем, когда я забываю обновить индексы индексов жестко закодированных столбцов. – Suragch

+0

@ Сурагч: Я в этом сомневаюсь. Это потребует * анализа * строки запроса. –