swift3.0:sqlite3的使用

介紹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()
    }
}
相關文章
相關標籤/搜索