读写应用程序数据-SQLite3
生活随笔
收集整理的這篇文章主要介紹了
读写应用程序数据-SQLite3
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
SQLite3是嵌入到ios中的關系型數據庫。對存儲大規模的數據非常實用,使得不必將每個對象加到內存中。
支持NULL、INTEGER、REAL(浮點數字)、TEXT(字符串和文本)、BLOB(二進制對象)數據類型。
1、通過Firefox中的SQLite Manager組件創建一個數據庫文件,并在其中創建創建一個Table,添加相關的參數。
2、將創建好的文件推到Xcode項目中,并在Link Binary With Libraries中添加libsqlite3.dylib依賴庫。
3、新建一個C語言類型文件,對話框會自動添加橋接文件,在文件中添加語句#import<sqlite3.h>。
4、然后創建一個DataBaseOperations.swift文件來管理數據庫。
在DataBaseOperation.swift文件中,申明一個數據庫指針。
//不透明指針,對應C語言里面的void *,這里指sqlite3指針private var db:COpaquePointer = nil創建一個初始化方法,在初始化方法中執行打開數據庫操作。
//初始化方法打開數據庫 required init(dbPath:String){print("db path:" + dbPath)//String類的路徑,轉換成cStringlet cpath = dbPath.cStringUsingEncoding(NSUTF8StringEncoding)//打開數據庫let error = sqlite3_open(cpath!, &db)//數據庫打開失敗處理if error != SQLITE_OK {sqlite3_close(db)}} deinit{self.colseDb()}//關閉數據庫 func colseDb(){sqlite3_close(db)} //代碼創建表func createTable() -> Bool{//sql語句let sql = "CREATE TABLE UserTable(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, username TEXT NOT NULL, password TEXT NOT NULL, email TEXT, age INTEGER)"//執行sql語句let execResult = sqlite3_exec(db, sql.cStringUsingEncoding(NSUTF8StringEncoding)!, nil, nil, nil);//判斷是否執行成功if (execResult != SQLITE_OK) {return false}return true} //插入一條信息func addUser(user: Person) -> Bool{//sql語句let sql = "INSERT INTO UserTable (username, password, email, age) VALUES (?, ?, ?, ?);";//sql語句轉換成cString類型 let cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding)//sqlite3_stmt 指針var stmt:COpaquePointer = nil//1.編譯sqllet prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil)//判斷如果失敗,獲取失敗信息if prepare_result != SQLITE_OK {sqlite3_finalize(stmt)if let error = String.fromCString(sqlite3_errmsg(self.db)) {let msg = "SQLiteDB - failed to prepare SQL: \(sql), Error: \(error)"print(msg)self.alert(msg)}return false}//2.bind 綁定參數//第2個參數:索引從1開始//最后一個參數為函數指針sqlite3_bind_text(stmt, 1, user.name!.cStringUsingEncoding(NSUTF8StringEncoding)!, -1, nil);sqlite3_bind_text(stmt, 2, user.password!.cStringUsingEncoding(NSUTF8StringEncoding)!, -1, nil);sqlite3_bind_text(stmt, 3, user.email!.cStringUsingEncoding(NSUTF8StringEncoding)!, -1, nil);sqlite3_bind_int(stmt, 4, CInt(user.age!));//3.step執行let step_result = sqlite3_step(stmt)//判斷執行結果,如果失敗,獲取失敗信息if step_result != SQLITE_OK && step_result != SQLITE_DONE {sqlite3_finalize(stmt)if let err = String.fromCString(sqlite3_errmsg(self.db)) {let msg = "SQLiteDB - failed to execute SQL: \(sql), Error: \(err)"print(msg)self.alert(msg)}return false}//4.finalize sqlite3_finalize(stmt);return true} //查詢func readAllUsers() -> [Person]{//聲明一個Person對象數組(查詢的信息會添加到該數組)var usersArr = [Person]()//查詢sql語句let sql = "SELECT * FROM UserTable;";//sqlite3_stmt 指針var stmt:COpaquePointer = nillet cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding)//1.編譯sqllet prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil)if prepare_result != SQLITE_OK {sqlite3_finalize(stmt)if let error = String.fromCString(sqlite3_errmsg(self.db)) {let msg = "SQLiteDB - failed to prepare SQL: \(sql), Error: \(error)"print(msg)self.alert(msg)}return usersArr}//2.stepwhile (sqlite3_step(stmt) == SQLITE_ROW) {let user = Person()//循環 從數據庫獲取數據,添加到數組中let cName = UnsafePointer<CChar>(sqlite3_column_text(stmt, 0))let cPwd = UnsafePointer<CChar>(sqlite3_column_text(stmt, 1))let cEmail = UnsafePointer<CChar>(sqlite3_column_text(stmt, 2))let cAge = sqlite3_column_int(stmt, 3)user.name = String.fromCString(cName)user.password = String.fromCString(cPwd)user.email = String.fromCString(cEmail)user.age = Int(cAge)usersArr += [user]}//3.finalize sqlite3_finalize(stmt);return usersArr} //更新一條信息func updateUser(name: String , toName:String) -> Bool{//更新sql語句let sql = "update UserTable set username = '\(toName)' where username = '\(name)'";//sqlite3_stmt 指針var stmt:COpaquePointer = nillet cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding)//1.編譯sqllet prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil)//判斷如果失敗,獲取失敗信息if prepare_result != SQLITE_OK {sqlite3_finalize(stmt)if let error = String.fromCString(sqlite3_errmsg(self.db)) {let msg = "SQLiteDB - failed to prepare SQL: \(sql), Error: \(error)"print(msg)self.alert(msg)}return false}//2.step執行let step_result = sqlite3_step(stmt)//判斷執行結果,如果失敗,獲取失敗信息if step_result != SQLITE_OK && step_result != SQLITE_DONE {sqlite3_finalize(stmt)if let err = String.fromCString(sqlite3_errmsg(self.db)) {let msg = "SQLiteDB - failed to execute SQL: \(sql), Error: \(err)"print(msg)self.alert(msg)}return false}//4.finalize sqlite3_finalize(stmt);return true} //刪除一條信息func deleteUser(username: String) -> Bool{//刪除sql語句let sql = "delete from UserTable where username = '\(username)'";//sqlite3_stmt 指針var stmt:COpaquePointer = nillet cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding)//1.編譯sqllet prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil)//判斷如果失敗,獲取失敗信息if prepare_result != SQLITE_OK {sqlite3_finalize(stmt)if let error = String.fromCString(sqlite3_errmsg(self.db)) {let msg = "SQLiteDB - failed to prepare SQL: \(sql), Error: \(error)"print(msg)self.alert(msg)}return false}//3.step執行let step_result = sqlite3_step(stmt)//判斷執行結果,如果失敗,獲取失敗信息if step_result != SQLITE_OK && step_result != SQLITE_DONE {sqlite3_finalize(stmt)if let err = String.fromCString(sqlite3_errmsg(self.db)) {let msg = "SQLiteDB - failed to execute SQL: \(sql), Error: \(err)"print(msg)self.alert(msg)}return false}//4.finalize sqlite3_finalize(stmt);return true} //定義一個報警器 func alert(msg:String) {dispatch_async(dispatch_get_main_queue()) {let alert = UIAlertView(title: "SQLiteDB", message:msg, delegate: nil, cancelButtonTitle: "OK")alert.show()}}因為工程數據庫文件打包之后,會在NSBundle.mainBundle()路徑下,該路徑是只讀的,不允許修改,所以必須把該路徑下的數據庫拷貝一份到Documents路徑下,以后整個工程都將操作Documents路徑下的數據庫。
在ViewController中,添加一下代碼。
//聲明一個Documents下的路徑let dbPath = NSHomeDirectory() + "/Documents/RWDataTest.sqlite"//判斷數據庫文件是否存在if !NSFileManager.defaultManager().fileExistsAtPath(dbPath){//獲取安裝包內數據庫路徑let bundleDBPath = NSBundle.mainBundle().pathForResource("RWDataTest", ofType: "sqlite")!//將安裝包內數據庫拷貝到Documents目錄下do{try NSFileManager.defaultManager().copyItemAtPath(bundleDBPath, toPath: dbPath)}catch let error as NSError {print(error)//如果創建失敗,error 會返回錯誤信息 }} //打開數據庫let dbOperation = DatabaseOperations(dbPath: dbPath)//添加一張表 dbOperation.createTable();//插入一條信息, 通過Person對象來傳值let person:Person = Person(name: "劉明洋", pwd: "liumingyang", email: "liumingyang@leadingdo.com", age: 30)dbOperation.addUser(person)//查詢let personArray:[Person] = dbOperation.readAllUsers()print("共搜索到:\(personArray.count) 條數據" )//更新dbOperation.updateUser("劉明洋", toName: "劉蕙通")//刪除dbOperation.deleteUser("劉蕙通")//關閉數據庫dbOperation.colseDb()?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的读写应用程序数据-SQLite3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kmemleak的使用---内存泄露检测
- 下一篇: Mysql增删改