Swift-SQLite

SQLite函數總結

1.打開數據庫
int sqlite3_open(
    const char *filename,   // 數據庫的文件路徑
    sqlite3 **ppDb          // 數據庫實例
);

2.執(zhí)行任何SQL語句
int sqlite3_exec(
    sqlite3*,                                  // 一個打開的數據庫實例
    const char *sql,                           // 需要執(zhí)行的SQL語句
    int (*callback)(void*,int,char**,char**),  // SQL語句執(zhí)行完畢后的回調
    void *,                                    // 回調函數的第1個參數
    char **errmsg                              // 錯誤信息
);

3.檢查SQL語句的合法性(查詢前的準備)
int sqlite3_prepare_v2(
    sqlite3 *db,            // 數據庫實例
    const char *zSql,       // 需要檢查的SQL語句
    int nByte,              // SQL語句的最大字節(jié)長度
    sqlite3_stmt **ppStmt,  // sqlite3_stmt實例,用來獲得數據庫數據
    const char **pzTail
);

4.查詢一行數據
int sqlite3_step(sqlite3_stmt*); // 如果查詢到一行數據,就會返回SQLITE_ROW

5.利用stmt獲得某一字段的值(字段的下標從0開始)
double sqlite3_column_double(sqlite3_stmt*, int iCol);  // 浮點數據
int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型數據
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 長整型數據
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二進制文本數據
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);  // 字符串數據

  • 如何封裝工具類,來做數據庫操作,總結如下步驟
    • 0.封裝?工具類,來做數據庫操作設計成單例
    • 1.打開或者創(chuàng)建數據庫sqlite3_open
    • 2.創(chuàng)建表sqlite3_exec
    • 3.添加/修改/刪除sqlite3_exec
    • 4.查詢數據sqlite3_prepare_v2

附上代碼:

存儲對象Person類

import UIKit

class Person: NSObject {
    var age : Int = 0
    var name : String?
    
    init(dict : [String : AnyObject]) {
        super.init()
        
        setValuesForKeysWithDictionary(dict)
    }
    
    // MARK:- 和數據庫之間的操作
    func insertPerson() {
        // 1.獲取插入的SQL語句
        let tempName = name == nil ? "" : name!
        let insertSQL = "INSERT INTO t_person (name, age) VALUES ('\(tempName)', \(age))"
        
        // 2.執(zhí)行SQL語句
        if SQLiteManager.shareIntance.execSQL(insertSQL) {
            print("插入成功")
        }
    }
}

工具類

import UIKit

class SQLiteManager: NSObject {
    // let修飾常量是線程安全
    static let shareIntance : SQLiteManager = SQLiteManager()
    
    /// 數據庫句柄
    var db : COpaquePointer = nil
    

 override init() {
        super.init()
        openDB("demo.sqlite")
    }

    /// 提供一個函數,讓別人可以打開一個數據庫
    func openDB(dbName : String) {
        // 1.獲取數據庫文件存放的路徑
        guard var path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first else {
            print("沒有獲取到路徑")
            return
        }
        path = (path as NSString).stringByAppendingPathComponent(dbName)
        print(path)
        
        // 2.打開數據庫:如果有數據庫則打開,如果沒有則創(chuàng)建
        // 參數三:數據庫句柄(類似于游戲手柄).
        // COpaquePointer : Swift中是沒有指針,但是在Swift和OC/C開發(fā)過程中使用指針再所難免
        SQLITE_OK
        if sqlite3_open(path, &db) != SQLITE_OK {
            print("打開或者創(chuàng)建數據庫失敗")
            return
        }
        
        // 3.創(chuàng)建表
        createTable()
    }
    
    
    /// 創(chuàng)建一張表
    func createTable() {
        // 1.獲取創(chuàng)建表的SQL語句
        let createTableSQL = "CREATE TABLE IF NOT EXISTS t_person ( \n" +
            "id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \n" +
            "name TEXT, \n" +
            "age INTEGER\n" +
            ");"
        
        // 2.執(zhí)行SQL語句
        if execSQL(createTableSQL) {
            print("創(chuàng)建表成功")
        }
    }
    
    /// 執(zhí)行SQL語句(創(chuàng)建表/添加/刪除/修改)
    func execSQL(sqlString : String) -> Bool {
        // 1.參數一:數據庫句柄
        // 2.參數二:sql語句
        // 3.參數三:執(zhí)行完語句會回調的閉包,一般傳nil即可
        // 4.參數四:和參數三相關的一個參數.一般傳nil科技
        // 5.參數五:錯誤信息.
        return sqlite3_exec(db, sqlString, nil, nil, nil) == SQLITE_OK
    }
    
    
    /// 執(zhí)行查詢操作(將查詢到的結果返回到一個字典數組中)
    func querySQL(querySQL : String) -> [[String : AnyObject]]? {
        
        // 1.定義游標指針
        var stmt : COpaquePointer = nil
        
        // 2.查詢的準備工作(給stmt賦值)
        // 1.參數一:數據庫句柄
        // 2.參數二:查詢語句
        // 3.參數三:查詢語句的長度. -1是自動計算
        // 4.參數四:數據庫`游標`對象
        if sqlite3_prepare_v2(db, querySQL, -1, &stmt, nil) != SQLITE_OK {
            print("沒有準備好查詢")
            return nil
        }
        
        // 3.查看是否有下一條語句
        var dictArray = [[String : AnyObject]]()
        while sqlite3_step(stmt) == SQLITE_ROW {
            // 有下一條語句,則將該語句轉成字典,放入數組中
            dictArray.append(getRecord(stmt))
        }
        
        return dictArray
    }
    
    /// 根據'游標指針'獲取一條數據
    func getRecord(stmt : COpaquePointer) -> [String : AnyObject] {
        // 1.獲取字段個數
        let count = sqlite3_column_count(stmt)
        var dict = [String : AnyObject]()
        for i in 0..<count {
            // 2.取出字典對應的key
            let cKey = sqlite3_column_name(stmt, i)
            guard let key = String(CString: cKey, encoding: NSUTF8StringEncoding) else {
                continue
            }
            
            // 3.取出字典對應的value
            let cValue = UnsafePointer<Int8>(sqlite3_column_text(stmt, i))
            guard let value = String(CString: cValue, encoding: NSUTF8StringEncoding) else {
                continue
            }
            
            // 4.將鍵值放入字典中
            dict[key] = value
        }
        
        return dict
    }
}

在控制器

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        loadPersonData()
    }
    
    /// 加載所有的數據
    func loadPersonData() {
        // 1.獲取查詢語句
        let querySQL = "SELECT name, age FROM t_person;"
        
        // 2.執(zhí)行查詢語句
        guard let array = SQLiteManager.shareIntance.querySQL(querySQL) else {
            return
        }
        
        // 3.遍歷數組
        var persons : [Person] = [Person]()
        for dict in array {
            let p = Person(dict: dict)
            persons.append(p)
        }
    }
    
    // MARK:- 對數據庫的操作:添加/修改/刪除
    func deleteData() {
        // 1.獲取刪除的SQL語句
        let deleteSQL = "DELETE FROM t_person WHERE id = 1;"
        
        // 2.執(zhí)行SQL語句
        if SQLiteManager.shareIntance.execSQL(deleteSQL) {
            print("刪除成功")
        }
    }
    
    func updateData() {
        // 1.獲取修改的SQL語句
        let updateSQL = "UPDATE t_person SET name = 'lmj' WHERE id = 1;"
        
        // 2.執(zhí)行SQL語句
        if SQLiteManager.shareIntance.execSQL(updateSQL) {
            print("修改成功")
        }
    }
    
    func insertData(name : String, age : Int) {
        // 1.創(chuàng)建person對象
        let p = Person(dict: ["name" : name, "age" : age])
        
        // 2.將自己插入到數據庫中
        p.insertPerson()
    }
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容