7

SQLite.swift のドキュメントには、任意の SQL の実行について次のように記載されています。

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("alice@mac.com")
    }
}

このように値を直接取得したかった

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'
}

しかし、行インデックスは型Binding?であり、それを必要な型に変換する方法がわかりません。ソースコードStatement.bindにメソッドがあるようですが、それを適用する方法をまだ発見していません。

4

1 に答える 1

7

次のように、テーブルから正しく入力された選択された列を取得できます。

// 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)
    }
}
于 2016-08-15T18:35:45.983 に答える