Android開発爆笑記

レセプターのソフト&ハード開発備忘録

SwiftでSQLiteを使う

import SQLite3

 

class ViewController〜

    var db: OpaquePointer?

    let dbName : String = "your_database_name.db"

    let tableName = "main_table_name"

    override func viewDidLoad() {

        // データベースファイルのパスを取得

        let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)

            .appendingPathComponent(dbName)

 

        // データベースを開く

        if sqlite3_open(fileURL.path, &db) != SQLITE_OK {

            print("データベースを開けませんでした。")

            return

        }

 

        // テーブルの作成

        if !tableExists(tableName: tableName) {

            let createTableQuery = "CREATE TABLE \(tableName) (_id INTEGER PRIMARY KEY AUTOINCREMENT, 〜 memo TEXT);"

            if sqlite3_exec(db, createTableQuery, nil, nil, nil) != SQLITE_OK {

                let errmsg = String(cString: sqlite3_errmsg(db)!)

                print("テーブルを作成できませんでした。エラー: \(errmsg)")

                return

            }

            print("テーブルを作成")

        } else {

            print("テーブルは作成済み")

        }

        〜

} ←viewDidLoad()の対応カッコ

 

    // テーブル有無チェック

    func tableExists(tableName: String) -> Bool {

        let query = "SELECT name FROM sqlite_master WHERE type='table' AND name='\(tableName)';"

        var statement: OpaquePointer?

        sqlite3_prepare_v2(db, query, -1, &statement, nil)

        let result = sqlite3_step(statement)

        sqlite3_finalize(statement)

        return result == SQLITE_ROW

    }

    

    // データ挿入

    func insertData() {

        let insertQuery = "INSERT INTO \(tableName) (〜,memo) VALUES (〜, ?);"

 

        var statement: OpaquePointer?

        if sqlite3_prepare_v2(db, insertQuery, -1, &statement, nil) == SQLITE_OK {

            let b〜

            let memo = "This is a memo"

 

            sqlite3_bind_text(statement, 1, (b〜 as NSString).utf8String, -1, nil)

            〜

            sqlite3_bind_text(statement, 8, (memo as NSString).utf8String, -1, nil)

 

            if sqlite3_step(statement) == SQLITE_DONE {

                print("データの挿入に成功しました。")

            } else {

                let errmsg = String(cString: sqlite3_errmsg(db)!)

                print("データの挿入に失敗しました。エラー: \(errmsg)")

            }

        } else {

            let errmsg = String(cString: sqlite3_errmsg(db)!)

            print("ステートメントの作成に失敗しました。エラー: \(errmsg)")

        }

 

        sqlite3_finalize(statement)

    }

    

    // 全件表示

    func displayData() {

        let selectQuery = "SELECT * FROM \(tableName);"

        var statement: OpaquePointer?

 

        if sqlite3_prepare_v2(db, selectQuery, -1, &statement, nil) == SQLITE_OK {

            while sqlite3_step(statement) == SQLITE_ROW {

                let id = sqlite3_column_int(statement, 0)

                let b〜

                let memo = String(cString: sqlite3_column_text(statement, 8))

 

                print("ID: \(id), B〜, Memo: \(memo)")

            }

        } else {

            let errmsg = String(cString: sqlite3_errmsg(db)!)

            print("データの取得に失敗しました。エラー: \(errmsg)")

        }

 

        sqlite3_finalize(statement)

    }

    

    // 検索

    func searchData() {

        let searchQuery = "SELECT * FROM \(tableName) WHERE key = ?;"

        var statement: OpaquePointer?

 

        if sqlite3_prepare_v2(db, searchQuery, -1, &statement, nil) == SQLITE_OK {

            let searchKey = "文字列"

 

            sqlite3_bind_text(statement, 1, (searchKey as NSString).utf8String, -1, nil)

 

            while sqlite3_step(statement) == SQLITE_ROW {

                let id = sqlite3_column_int(statement, 0)

                let b〜

                〜

                let memo = String(cString: sqlite3_column_text(statement, 8))

 

                print("ID: \(id), B〜, Memo: \(memo)")

            }

        } else {

            let errmsg = String(cString: sqlite3_errmsg(db)!)

            print("データの検索に失敗しました。エラー: \(errmsg)")

        }

 

        sqlite3_finalize(statement)

    }

    

    // 更新

    func updateData() {

        let updateQuery = "UPDATE \(tableName) SET name = ? WHERE key = ?;"

        var statement: OpaquePointer?

 

        if sqlite3_prepare_v2(db, updateQuery, -1, &statement, nil) == SQLITE_OK {

            let newName = "New Brand Name"

            let targetKey = "400000004"

 

            sqlite3_bind_text(statement, 1, (newName as NSString).utf8String, -1, nil)

            sqlite3_bind_text(statement, 2, (targetKey as NSString).utf8String, -1, nil)

 

            if sqlite3_step(statement) == SQLITE_DONE {

                print("データの更新に成功しました。")

            } else {

                let errmsg = String(cString: sqlite3_errmsg(db)!)

                print("データの更新に失敗しました。エラー: \(errmsg)")

            }

        } else {

            let errmsg = String(cString: sqlite3_errmsg(db)!)

            print("ステートメントの作成に失敗しました。エラー: \(errmsg)")

        }

 

        sqlite3_finalize(statement)

    }

    

    // 削除

    func deleteData() {

        let deleteQuery = "DELETE FROM \(tableName) WHERE key = ?;"

        var statement: OpaquePointer?

 

        if sqlite3_prepare_v2(db, deleteQuery, -1, &statement, nil) == SQLITE_OK {

            let targetKey = "文字列"

 

            sqlite3_bind_text(statement, 1, (targetKey as NSString).utf8String, -1, nil)

 

            if sqlite3_step(statement) == SQLITE_DONE {

                print("データの削除に成功しました。")

            } else {

                let errmsg = String(cString: sqlite3_errmsg(db)!)

                print("データの削除に失敗しました。エラー: \(errmsg)")

            }

        } else {

            let errmsg = String(cString: sqlite3_errmsg(db)!)

            print("ステートメントの作成に失敗しました。エラー: \(errmsg)")

        }

 

        sqlite3_finalize(statement)

    }