---純Swift的中SQLite 的使用,---swiftsqlite

來源:互聯網
上載者:User

---純Swift的中SQLite 的使用,---swiftsqlite

SQLite.swift 是一個使用純 Swift 語言封裝 SQLite3 的操作架構。

特性:

  • 簡單的查詢和參數綁定介面 

  • 安全、自動類型資料訪問

  • 隱式提交和復原介面

  • 開發人員友好的錯誤處理和調試

  • 文檔完善

  • 通過廣泛測試  

示範代碼:

import Foundation/**    1. 開啟資料庫    2. 如果沒有資料表,需要首先創表    3. 資料操作*/class SQLite {        var db: COpaquePointer = nil        ///  開啟資料庫    ///    ///  :param: dbname 資料庫名稱    ///    ///  :returns: 是否開啟成功    func openDatabase(dbname: String) -> Bool {                // UnsafePointer<Int8> UnsafePointer<CChar>         // 對應C語言中的 char*        // filename 必須是完整的路徑名        let path = dbname.documentPath()        println(path)                // sqlite3_open 如果如果資料庫不存在,會建立資料庫檔案        // 如果資料庫檔案已經存在,就直接開啟,返回控制代碼,不會對資料有任何影響        if sqlite3_open(path, &db) == SQLITE_OK {            println("開啟資料庫成功")                        // 本質上只需要運行一次就可以了            if createTable() {                println("創表成功")                                // TODO: 測試查詢資料                let sql = "SELECT id, DepartmentNo, Name FROM T_Department;"                recordSet(sql)            } else {                println("創表失敗")            }        } else {            println("開啟資料庫失敗")        }                return false    }        ///  建立資料表,將系統需要的資料表,一次性建立    private func createTable() -> Bool {                // 準備所有資料表的 SQL        // 1> 每一個 SQL 完成後都有一個 ;        // 2> 將所有創表 SQL 寫在一起,每一個換行添加一個 \n        let sql = "CREATE TABLE \n" +            "IF NOT EXISTS T_Department (\n" +            "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n" +            "DepartmentNo CHAR(10) NOT NULL DEFAULT '',\n" +            "Name CHAR(50) NOT NULL DEFAULT '' \n" +            "); \n" +            "CREATE TABLE IF NOT EXISTS T_Employee ( \n" +            "'id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \n" +            "'name' TEXT NOT NULL, \n" +            "'age' INTEGER NOT NULL, \n" +            "'department_id' INTEGER, \n" +            "CONSTRAINT 'FK_DEP_ID' FOREIGN KEY ('department_id') REFERENCES 'T_Department' ('id') \n" +        ");"                return execSQL(sql)    }        ///  執行沒有傳回值的 SQL 陳述式    ///    ///  :param: sql SQL 字串    ///    ///  :returns: 是否成功    func execSQL(sql: String) -> Bool {                /**            1. 資料庫指標            2. SQL 字串的 C 語言格式            3. 回調,執行完成 SQL 指令之後的函數回調,通常都是 nil            4. 回調的第一個參數的指標            5. 錯誤資訊,通常也傳入 nil        */        return sqlite3_exec(db, sql.cStringUsingEncoding(NSUTF8StringEncoding)!, nil, nil, nil) == SQLITE_OK    }        ///  執行 SQL 返回一個結果集(對象數組)    ///    ///  :param: sql SQL 字串    func recordSet(sql: String) {                // 1. 準備語句        var stmt: COpaquePointer = nil        /**            1. 資料庫控制代碼            2. SQL 的 C 語言的字串            3. SQL 的 C 語言的字串長度 strlen,-1 會自動計算            4. stmt 的指標            5. 通常傳入 nil        */        if sqlite3_prepare_v2(db, sql.cStringUsingEncoding(NSUTF8StringEncoding)!, -1, &stmt, nil) == SQLITE_OK {                        // 單步擷取SQL執行的結果 -> sqlite3_setup 對應一條記錄            while sqlite3_step(stmt) == SQLITE_ROW {                // 擷取每一條記錄的資料                recordData(stmt)            }        }    }        ///  擷取每一條資料的記錄    ///    ///  :param: stmt prepared_statement 對象    func recordData(stmt: COpaquePointer) {        // 擷取到記錄        var count = sqlite3_column_count(stmt)        println("擷取到記錄,共有多少列 \(count)")        // 遍曆每一列的資料        for i in 0..<count {            let type = sqlite3_column_type(stmt, i)                        // 根據欄位的類型,提取對應列的值            switch type {            case SQLITE_INTEGER:                println("整數 \(sqlite3_column_int64(stmt, i))")            case SQLITE_FLOAT:                println("小樹 \(sqlite3_column_double(stmt, i))")            case SQLITE_NULL:                println("空 \(NSNull())")            case SQLITE_TEXT:                let chars = UnsafePointer<CChar>(sqlite3_column_text(stmt, i))                let str = String(CString: chars, encoding: NSUTF8StringEncoding)!                println("字串 \(str)")            case let type:                println("不支援的類型 \(type)")            }        }    }}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.