# 數(shù)據(jù)庫

封裝自定義數(shù)據(jù)庫的工具類

class SQLiteTool: NSObject {

    // 懶加載數(shù)據(jù)庫工具類的單例對象
    static let shareIstance = SQLiteTool()
    // 指向數(shù)據(jù)庫的指針
    var db: COpaquePointer = nil

    // 重構(gòu)
    override init() {
        super.init()

        let path = "/Users/yangxiaoming/Desktop/sql/Untitled.sqlite"
        // 打開數(shù)據(jù)庫
        if sqlite3_open(path, &db) != SQLITE_OK {
            print("數(shù)據(jù)庫打開成功")
        }else {
            print("數(shù)據(jù)庫打開失敗")
            // 創(chuàng)建表
            createTtable()
        }
    }
}

然后可以在該工具類中定義一些需要實(shí)現(xiàn)的操作的方法:對表中數(shù)據(jù)的曾粱快、刪屹堰、改碟渺、查的方法(這里封裝了所有的操作的一個方法鲜锚,可以根據(jù)傳入進(jìn)來的sql語句,然后進(jìn)行執(zhí)行)

  • exec表示執(zhí)行的意思
func excuteSql(sql: String) -> Bool {
        // 2. 執(zhí)行sql語句
        // 功能, 執(zhí)行sql字符串
        // 參數(shù)1: 一個已經(jīng)打開的數(shù)據(jù)庫(代表操作的是哪一個數(shù)據(jù)庫)
        // 參數(shù)2: sql語句
        // 參數(shù)3: 回調(diào)函數(shù) nil
        // 參數(shù)4: 參數(shù)3: 回調(diào)函數(shù)里面的參數(shù)1 nil
        // 參數(shù)5: 錯誤信息 nil
        return sqlite3_exec(db, sql, nil , nil , nil) == SQLITE_OK
    }

數(shù)據(jù)庫的優(yōu)化(大批量插入數(shù)據(jù)的操作)insert綁定參數(shù)

  1. 如果大批量插入數(shù)據(jù)的話有兩種方案
  • 方案一:sqlite3_step() 準(zhǔn)備語句(執(zhí)行準(zhǔn)備語句)

  • 方案二:sqlite3_exec() sql字符串(執(zhí)行sql語句)

  • 優(yōu)化的原理:

    • 由于這兩個執(zhí)行函數(shù)苫拍,在執(zhí)行的時候內(nèi)部都會自動開啟一個事務(wù)芜繁,當(dāng)執(zhí)行完畢之后提交事務(wù),整個過程(開啟事務(wù)->提交事務(wù))是非常耗費(fèi)時間(簡單來說就是插入提交绒极,插入提交....)
    • 優(yōu)化實(shí)現(xiàn):手動實(shí)現(xiàn)事務(wù)的開啟和提交骏令,那么在函數(shù)內(nèi)部, 就不會自動開啟和提交事務(wù)
  • 方案一的實(shí)現(xiàn):insert綁定參數(shù)和事務(wù)開啟和提交的手動實(shí)現(xiàn)測試插入數(shù)據(jù)的耗時計(jì)算

func insertBind() -> () {
        let sql = "insert into t_stu(name, age, score) values (?, ?, ?);"

        // 1. 創(chuàng)建"準(zhǔn)備語句"
        // 參數(shù)1: 一個打開的數(shù)據(jù)庫
        // 參數(shù)2: sql字符串
        // 參數(shù)3: 取出參數(shù)2 的長度 3  -1代表自動計(jì)算
        // 參數(shù)4: 指向"準(zhǔn)備語句的指針"
        // 參數(shù)5: 通過參數(shù)3指定的長度, 取出參數(shù)2, 字符串之后, 剩余的字符串 nil
        let db = SQLiteTool.shareInstance.db
        var stmt: COpaquePointer = nil
        if sqlite3_prepare_v2(db, sql, -1, &stmt, nil) != SQLITE_OK {
            print("準(zhǔn)備語句創(chuàng)建失敗")
            return
        }

        // 開啟事務(wù)
        SQLiteTool.shareInstance.beginTransaction()

        // 測試插入數(shù)據(jù)耗時
        for _ in 0..<10000 {
            // 2. 綁定數(shù)據(jù)(不同的數(shù)據(jù)類型, 綁定的方法不一樣)
            /**
            *   參數(shù):
            *   COpaquePointer:準(zhǔn)備語句
            *   Int32:綁定的索引 從1開始
            *   UnsafePointer<Int8>:綁定的值(給 ?位置傳的值)
            *   Int32:代表, 值取出的長度 -1 自動計(jì)算
            *   ((UnsafeMutablePointer<Void>) -> Void)!:指向函數(shù)的指針: 參數(shù)的處理方式
            */
            // #define SQLITE_STATIC      處理方式: 不對參數(shù)做任何操作(認(rèn)為參數(shù)是一個static)
            // #define SQLITE_TRANSIENT   處理方式: 會對參數(shù), 做一個強(qiáng)引用, 然后, 使用完畢之后, 在合適的時候釋放
            // 使用這個函數(shù)一定要注意: 需要明確的知道最終的確切類型是什么
            let SQLITE_TRANSIENT = unsafeBitCast(-1, sqlite3_destructor_type.self)
            sqlite3_bind_text(stmt, 1, "yang", -1, SQLITE_TRANSIENT)

            // 綁定 Int 類型
            sqlite3_bind_int(stmt, 2, 18)

            // 綁定 -Double 類型
            sqlite3_bind_double(stmt, 3, 99)

            // 3. 執(zhí)行"準(zhǔn)備語句"
            if sqlite3_step(stmt) == SQLITE_DONE {
                print("執(zhí)行成功")
            }else {
                print("執(zhí)行失敗")
            }

            // 4. 重置"準(zhǔn)備語句"
            sqlite3_reset(stmt)
        }

        // 提交事務(wù)
        SQLiteTool.shareInstance.commitTransaction()

        // 5. 釋放資源
        sqlite3_finalize(stmt)
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垄提,一起剝皮案震驚了整個濱河市榔袋,隨后出現(xiàn)的幾起案子周拐,更是在濱河造成了極大的恐慌,老刑警劉巖凰兑,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妥粟,死亡現(xiàn)場離奇詭異,居然都是意外死亡吏够,警方通過查閱死者的電腦和手機(jī)勾给,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锅知,“玉大人播急,你說我怎么就攤上這事∈鄱茫” “怎么了桩警?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侣姆。 經(jīng)常有香客問我生真,道長,這世上最難降的妖魔是什么捺宗? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任柱蟀,我火速辦了婚禮,結(jié)果婚禮上蚜厉,老公的妹妹穿的比我還像新娘长已。我一直安慰自己,他們只是感情好昼牛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布术瓮。 她就那樣靜靜地躺著,像睡著了一般贰健。 火紅的嫁衣襯著肌膚如雪胞四。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天伶椿,我揣著相機(jī)與錄音辜伟,去河邊找鬼。 笑死脊另,一個胖子當(dāng)著我的面吹牛导狡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播偎痛,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼旱捧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了踩麦?” 一聲冷哼從身側(cè)響起枚赡,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤氓癌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后标锄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顽铸,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年料皇,在試婚紗的時候發(fā)現(xiàn)自己被綠了谓松。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡践剂,死狀恐怖鬼譬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逊脯,我是刑警寧澤优质,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站军洼,受9級特大地震影響巩螃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匕争,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一避乏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甘桑,春花似錦拍皮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至德谅,卻和暖如春爹橱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窄做。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工宅荤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浸策。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像惹盼,于是被迫代替她去往敵國和親庸汗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容