技術ブログ

プログラミング、IT関連の記事中心

SQLite3でINSERT時にPrepared Statementを複数使用する方法【Swift】

■はじめに

以下のサイトを参考に、SQLite3は使用できるようにしておいてください。(基本的なことは飛ばして説明します。)

reigle.info

■手順

まずは、ソースコードの全量は以下

func insert() {
    var stmt: OpaquePointer?
    
    let queryString = "INSERT INTO sampleTable (name, age) VALUES (?, ?)"
    
    // クエリを準備する
    if sqlite3_prepare(db, queryString, -1, &stmt, nil) != SQLITE_OK{
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error preparing insert: \(errmsg)")
        return
    }
    
    // prepared statementを複数定義するために非定常の定義
    let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
    
    // 1つめの?の定義
    if sqlite3_bind_text(stmt, 1, "ひとつめ", -1, SQLITE_TRANSIENT) != SQLITE_OK{
        let errmsg = String(cString: sqlite3_errmsg(self.db)!)
        print("failure binding name: \(errmsg)")
        return
    }
    // 2つめの?の定義
    if sqlite3_bind_text(stmt, 2, "ふたつめ", -1, SQLITE_TRANSIENT) != SQLITE_OK{
        let errmsg = String(cString: sqlite3_errmsg(self.db)!)
        print("failure binding name: \(errmsg)")
        return
    }

    // クエリを実行する
    if sqlite3_step(stmt) != SQLITE_DONE {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("failure inserting hero: \(errmsg)")
        return
    }
    
    print("データが登録されました")
}

重要なのは、以下の定義です。

これは、複数のPrepared Statementを使用するための「おまじない」だと思ってください。

let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)

上記のおまじないの定数を「sqlite3_bind_text」の第五引数に設定することで、複数のPrepared Statementに値をそれぞれ設定できます。