標籤:style ... pen auto open bind ble lazy int
// 基本步驟// 1. 開啟資料庫// 2. 處理資料// 3. 關閉資料庫
//先設定全域變數lazy var documentsPath: String = { let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) return paths.first! }() //指標 var db: OpaquePointer? = nil var stmt: OpaquePointer? = nil
// 建立或開啟資料庫 func createOrOpenDatabase() { print("\(NSHomeDirectory())") //建立資料庫檔案路徑,並要改成UTF-8類型 let path: NSString = "\(documentsPath)/test.sqlite3" as NSString let filename = path.utf8String //判斷開啟資料庫是否成功(若沒有資料庫,會自動產生),不成功則列印輸入"create or open failed..."並關閉資料庫 if sqlite3_open(filename, &db) != SQLITE_OK { print("create or open failed...") sqlite3_close(db) } }// 建立學生表 func createTable() { //拼接sql語句並轉為UTF-8 let string: NSString = "create table if not exists Student(id integer primary key autoincrement, sno text, name text, score integer)" let sql = string.utf8String //執行sql語句 if sqlite3_exec(db, sql, nil, nil, nil) != SQLITE_OK { print("create table failed...") sqlite3_close(db) } }//slq的新增操作 func insertStudent(sno: String, name: String, score: Int) { // 準備SQL語句 let string: NSString = "insert into Student(sno, name, score) values(?, ?, ?)" let sql = string.utf8String // 解析SQL文本語句 //sqlite3_prepare_v2解析 //參數1:當前資料庫指標 //參數2:要解析的sql語句(預設以0結束) //參數3:因為sql語句預設以0結束,為了出去那個0,所以是-1 //參數4:另外一個指標用於解析後儲存,最後一個參數忘了,你直接寫nil就可以了 if sqlite3_prepare_v2(db, sql, -1, &stmt, nil) != SQLITE_OK { sqlite3_close(db) print("\(sno), insert failed...") } // 綁定參數 let csno = (sno as NSString).utf8String let cname = (name as NSString).utf8String sqlite3_bind_text(stmt, 1, csno, -1, nil) sqlite3_bind_text(stmt, 2, cname, -1, nil) sqlite3_bind_int(stmt, 3, Int32(score)) // 執行SQL語句 if sqlite3_step(stmt) == SQLITE_ERROR { sqlite3_close(db) print("\(sno), insert failed...") } else { // 釋放資源 sqlite3_finalize(stmt) } }// 修改學生資料 func updateStudent() { // 準備SQL語句 let string: NSString = "update Student set score = 100 where name like ‘a%‘" let sql = string.utf8String // 執行SQL語句 //sqlite3_exec後面的三個參數可以不用關,就寫nil就可以了 if sqlite3_exec(db, sql, nil, nil, nil) != SQLITE_OK { sqlite3_close(db) print("update failed...") } } // 刪除學生資料 func deleteStudents() { // 準備SQL語句 let string: NSString = "delete from Student where score < 60" let sql = string.utf8String // 執行SQL語句 if sqlite3_exec(db, sql, nil, nil, nil) != SQLITE_OK { sqlite3_close(db) print("delete failed...") } }
總結:增刪改(如果沒有參數,則第2,3步都不用寫)1:準備sql語句如:let string: NSString = "insert into Student(sno, name, score) values(?, ?, ?)"2:解析sql語句 如:sqlite3_prepare_v2(db, sql, -1, &stmt, nil)3:綁定參數如:let csno = (sno as NSString).utf8Stringsqlite3_bind_text(stmt, 1, csno, -1, nil)4執行語句 如:sqlite3_step(stmt)5:釋放資源 如:sqlite3_finalize(stmt) 查詢1:準備sql語句2:解析sql語句3: 執行SQL語句擷取每條記錄的資料(某些字元類型還要轉換才能顯示你要的結果)sqlite3_column_text(stmt, 0)4:釋放資源
sqlite的增刪改查