介紹sql
1、sqlite是純C語言中底層的數據庫,在OC和Swift中都是常用的數據庫,在開發中,能夠使用代碼建立數據庫,能夠使用圖形化界面建立數據庫。例如SQLiteManager、SQLiteStudio等數據庫
2、對經常使用的一些方法進行解釋以下:swift
OpaquePointer: *db,數據庫句柄,跟文件句柄FIFL相似,這裏是sqlite3指針;數組
sqlite3_stmt: *stmt,至關於ODBC的Command對象,用於保存編譯好的SQL語句;ide
sqlite3_open(): 打開數據庫,沒有數據庫時建立;函數
sqlite3_exec(): 執行非查詢的SQL語句;測試
sqlite3_step(): 在調用sqlite3_prepare後,使用這個函數在記錄集中移動;ui
sqlite3_close():關閉數據庫文件;spa
sqlite3_column_text():取text類型的數據;指針
sqlite3_column_blob():取blob類型的數據;
sqlite3_column_int():取int類型的數據;
3、使用SQLiteStudio建立數據庫,而後導出到桌面,再拖到項目中,最後經過代碼拷貝到Documens下進行操做,並獲取數據庫路徑
Person.swift
// Person.swift // swiftDemo // // Created by 夏遠全 on 2017/2/20. // Copyright © 2017年 夏遠全. All rights reserved. // import UIKit class Person: NSObject { var name:String? var password:String? var email:String? var age:Int? }
DatabaseOperation.swift
(1)打開數據庫
//不透明指針,對應C語言中的void *,這裏指sqlit3指針 private var db:OpaquePointer? = nil //初始化方法打開數據庫 required init(dbPath:String) { print("db path:" + dbPath) //String類的路徑,轉換成cString let cpath = dbPath.cString(using: .utf8) //打開數據庫 let error = sqlite3_open(cpath!,&db) //數據庫打開失敗 if error != SQLITE_OK { sqlite3_close(db) } }
(2)關閉數據庫
//關閉數據庫 deinit { self.closeDB() } func closeDB() -> Void { sqlite3_close(db) }
(3)建立表
//建立表 func creatTable() -> Bool { //sql語句 let sql = "CREATE TABLE UserTable(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,username TEXT NOT NULL, password TEXT NOT NULL,email TEXT NOT NULL,age INTEGER)" //執行sql語句 let excuResult = sqlite3_exec(db, sql.cString(using: .utf8), nil, nil, nil) //判斷是否執行成功 if excuResult != SQLITE_OK { return false } return true }
(4)插入數據
//插入數據 func addUser(user:Person) -> Bool { //sql語句 let sql = "INSERT INTO UserTable(username,password,email,age) VALUES(?,?,?,?);"; //sql語句轉換成cString類型 let cSql = sql.cString(using: .utf8) //sqlite3_stmt指針 var stmt:OpaquePointer? = nil //編譯 let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil) //判斷若是失敗,獲取失敗信息 if prepare_result != SQLITE_OK { sqlite3_finalize(stmt) if (sqlite3_errmsg(self.db)) != nil { let msg = "SQLiteDB - failed to prepare SQL:\(sql)" print(msg) } return false } //綁定參數 //第二個參數,索引從1開始 //最後一個參數爲函數指針 sqlite3_bind_text(stmt, 1, user.name!.cString(using: .utf8), -1, nil) sqlite3_bind_text(stmt, 2, user.password!.cString(using: .utf8), -1, nil) sqlite3_bind_text(stmt, 3, user.email!.cString(using: .utf8), -1, nil) sqlite3_bind_int(stmt, 4, Int32(Int(user.age!))) //step執行 let step_result = sqlite3_step(stmt) //判斷執行結果 if step_result != SQLITE_OK && step_result != SQLITE_DONE { sqlite3_finalize(stmt) if (sqlite3_errmsg(self.db)) != nil { let msg = "SQLiteDB - failed to execute SQL:\(sql)" print(msg) } return false } //finalize sqlite3_finalize(stmt) return true }
(5)查詢數據
//查詢數據 func readAllUsers() -> [Person] { //聲明一個Person對象數組(查詢的信息會添加到數組中) var userArr = [Person]() //查詢sql語句 let sql = "SELECT * FROM UserTable;"; //sqlite3_stmt指針 var stmt:OpaquePointer? = nil let cSql = sql.cString(using: .utf8) //編譯 let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil) if prepare_result != SQLITE_OK { sqlite3_finalize(stmt) if (sqlite3_errmsg(self.db)) != nil { let msg = "SQLiteDB - failed to prepare SQL:\(sql)" print(msg) } } //step while (sqlite3_step(stmt) == SQLITE_ROW) { let user = Person() //循環從數據庫數據,添加到數組 let cName = UnsafePointer(sqlite3_column_text(stmt, 0)) let cPwd = UnsafePointer(sqlite3_column_text(stmt, 1)) let cEmail = UnsafePointer(sqlite3_column_text(stmt, 2)) let cAge = sqlite3_column_int(stmt, 3) user.name = String.init(cString: cName!) user.password = String.init(cString: cPwd!) user.email = String.init(cString: cEmail!) user.age = Int(cAge) userArr += [user] } //finalize sqlite3_finalize(stmt) return userArr }
(6)更新數據
//更新數據 func updateUser(name:String,toName:String) -> Bool { //更新sql語句 let sql = "update UserTable set username = '\(toName)' where username = '\(name)'"; //sqlite3_stmt指針 var stmt:OpaquePointer? = nil let cSql = sql.cString(using: .utf8) //編譯sql let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil) //判斷若是失敗,獲取失敗信息 if prepare_result != SQLITE_OK { sqlite3_finalize(stmt) if (sqlite3_errmsg(self.db)) != nil { let msg = "SQLiteDB - failed to prepare SQL:\(sql)" print(msg) } return false } //step執行 let step_result = sqlite3_step(stmt) //判斷執行結果,若是失敗,獲取失敗信息 if step_result != SQLITE_OK && step_result != SQLITE_DONE { sqlite3_finalize(stmt) if (sqlite3_errmsg(self.db)) != nil { let msg = "SQLiteDB - failed to execute SQL:\(sql)" print(msg) } return false } //finalize sqlite3_finalize(stmt) return true }
(7)刪除數據
//刪除數據 func deleteUser(username:String) -> Bool { //刪除sql語句 let sql = "delete from UserTable where username = '\(username)'"; //sqlite3_stmt指針 var stmt:OpaquePointer? = nil let cSql = sql.cString(using: .utf8) //編譯sql let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil) //判斷若是失敗,獲取失敗信息 if prepare_result != SQLITE_OK { sqlite3_finalize(stmt) if (sqlite3_errmsg(self.db)) != nil { let msg = "SQLiteDB - failed to prepare SQL:\(sql)" print(msg) } return false } //step執行 let step_result = sqlite3_step(stmt) //判斷執行結果,若是失敗,獲取失敗信息 if step_result != SQLITE_OK && step_result != SQLITE_DONE { sqlite3_finalize(stmt) if (sqlite3_errmsg(self.db)) != nil { let msg = "SQLiteDB - failed to execute SQL:\(sql)" print(msg) } return false } //finalize sqlite3_finalize(stmt) return true }
(8)複製數據庫路徑
//將Bundle.main路徑下的數據庫文件複製到Documents下 class func loadDBPath() -> String { //聲明一個Documents下的路徑 let dbPath = NSHomeDirectory() + "/Documents/RWDataTest.db" //判斷數據庫文件是否存在 if !FileManager.default.fileExists(atPath: dbPath) { //獲取安裝包內是否存在 let bundleDBPath = Bundle.main.path(forResource: "RWDataTest", ofType:"db")! //將安裝包內的數據庫到Documents目錄下 do { try FileManager.default.copyItem(atPath: bundleDBPath, toPath: dbPath) } catch let error as NSError { print(error) } } return dbPath }
ViewController.swift測試
// Created by 夏遠全 on 2017/1/13. // Copyright © 2017年 夏遠全. All rights reserved. // import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //打開數據庫 let path = DatabaseOperations.loadDBPath() let dbOpearion = DatabaseOperations.init(dbPath:path) print(path) //添加一張表 let person:Person = Person() person.name = "張三" person.password = "123566" person.email = "zhangsan@163.com" person.age = 30 //插入一條信息,經過Person對象來傳值 let addBool = dbOpearion.addUser(user: person) print(addBool) //查詢 let personArray:[Person] = dbOpearion.readAllUsers() print("共搜索到:\(personArray.count) 條數據") //更新 let updateBool = dbOpearion.updateUser(name: "張三", toName: "李四") print(updateBool) //刪除 let deleteBool = dbOpearion.deleteUser(username: "李四") print(deleteBool) //關閉數據庫 dbOpearion.closeDB() } }