麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

---純Swift的中SQLite的使用

2019-11-14 19:27:01
字體:
來源:轉載
供稿:網友

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)")            }        }    }}

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美激情第一区 | 久久在线免费视频 | 国产精品久久久久久久久久 | 天天草天天干天天射 | 久久精品黄 | 大西瓜永久免费av在线 | 毛片免费在线观看视频 | 久久影城 | 99在线免费观看视频 | 国产在线精品区 | 国产一区精品在线观看 | 在线看91 | 蜜桃久久一区二区三区 | 国产噜噜噜噜久久久久久久久 | 亚洲看片网 | 九九热九九爱 | 中文字幕在线观看成人 | 一级黄色免费观看 | 伊人99re | 免费观看黄色片视频 | 欧美一级美片在线观看免费 | 日本黄色a视频 | 精品久久久一二三区播放播放播放视频 | 欧美日韩在线视频观看 | 欧美激情视频一区二区免费 | 久久精品视频在线看99 | 91视频站| 亚洲网站在线观看视频 | 欧美18xxxx| 久久精精 | 毛片在线免费观看视频 | 久久超| 特级黄色影院 | 一级片999| 黄污网站在线观看 | 亚洲成人播放 | 中文字幕一区二区三区久久 | 国产精品1区2区在线观看 | 亚洲 91 | 免费观看视频在线观看 | 亚洲乱码精品久久久久 |