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