swift3.1 SQlite3 使用

導語

最近在寫swift網(wǎng)絡請求使用二級緩存的時候匹表,用到了SQLite3來保存緩存數(shù)據(jù),以前都是在oc中使用宣鄙,這次在swift3.1中使用袍镀,遇到了不少坑,分享給大家冻晤。

1苇羡、打開數(shù)據(jù)庫,創(chuàng)建表
    mutating func openSQLiteDataBase(path: String) -> Bool {
        if let _ = db {
            return true
        }
       //獲取cache路徑
        guard let basePath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory,FileManager.SearchPathDomainMask.userDomainMask, true).last else { return false }
        let finalPath = basePath + "/\(path)"
        //將string轉(zhuǎn)換成cString
        let cStr = finalPath.cString(using: .utf8)
        //返回openDB是否成功
        return sqlite3_open(cStr, &db) == SQLITE_OK
    }
    
    func creatTable() -> Bool {
        let creatTb = "create table if not exists netWorkCache (key text, size integer, inline_data blob,primary key(key));"
        //執(zhí)行SQL語句
        return execSQL(SQL:creatTb)
    }

func execSQL(SQL: String?) -> Bool {
        guard let sqlstr = SQL else { return false }
        let cSQL = sqlstr.cString(using: .utf8)
        let error :UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>? = nil
        let result = sqlite3_exec(db, cSQL, nil, nil, error)
        if let err = error {
            print("sqlite exec error \(result),\(err)")
        }
        return result == SQLITE_OK
    }
2鼻弧、插入數(shù)據(jù)(開始又坑了)

首先是這個key String 類型,轉(zhuǎn)換為cString來綁定數(shù)據(jù)時设江,經(jīng)常寫不進去,db表里面key這個值有時有數(shù)據(jù)攘轩,有時是空的叉存,有時只有不全的key,到處找資料度帮,修改SQL語句歼捏,也不行啊。最后在http://stackoverflow.com上找到了解決方法(還是國外牛人多氨颗瘛)瞳秽,解決方式:把String先轉(zhuǎn)換成NSString,再轉(zhuǎn)換成cString 這樣就寫進去了冕屯,我勒個去寂诱,完全不知道為什么這樣改了就能成功綁定了(有知道原因的大神請給我說說原因啊)安聘。Data類型數(shù)據(jù)也是同理痰洒。

  func insertDataToDist(key: String, size: Int, data: Data) -> Bool {
        let insetSql = "insert or replace into netWorkCache (key, size, inline_data) values (?1, ?2, ?3)"
        guard let stmt = dbPrepareStmt(sql: insetSql) else { return false }
        let nsdata = data as NSData
        let nskey = key as NSString
        sqlite3_bind_text(stmt, 1, nskey.utf8String, -1, nil)
        sqlite3_bind_int(stmt, 2, Int32(size))
        sqlite3_bind_blob(stmt, 3, nsdata.bytes, Int32(nsdata.length), nil)
        return sqlite3_step(stmt) == SQLITE_DONE
    }
3瓢棒、查找數(shù)據(jù)(同樣需要先轉(zhuǎn)成NSString,再轉(zhuǎn)換成cString)
    func getDbItem(key: String) -> NetCacheModel? {
        let searchSql = "select key, size, inline_data from netWorkCache where key = ?1"
        guard let stmt = dbPrepareStmt(sql: searchSql) else { return nil }
        let nskey = key as NSString
        sqlite3_bind_text(stmt, 1, nskey.utf8String, -1, nil)
        if sqlite3_step(stmt) == SQLITE_ROW {
           return dbGetItemFormStmt(stmt: stmt)
        }else {
            return nil
        }
    }
    
    func dbPrepareStmt(sql: String?) -> OpaquePointer? {
        guard let sqlStr = sql else { return nil }
        var stmt: OpaquePointer? = nil
        if sqlite3_prepare_v2(db, sqlStr.cString(using: .utf8), -1, &stmt, nil) == SQLITE_OK {
            return stmt
        }else {
            return nil
        }
    }
    
    func dbGetItemFormStmt(stmt:OpaquePointer) -> NetCacheModel? {
        let size = sqlite3_column_int(stmt, 1)
        let databytes = sqlite3_column_bytes(stmt, 2)
        guard let key = sqlite3_column_text(stmt, 0),
        let data = sqlite3_column_blob(stmt, 2) else { return nil }
        //取到data數(shù)據(jù)bytes丘喻,然后獲取length脯宿,初始化data
        let result = Data.init(bytes: data, count: Int(databytes))
        return NetCacheModel(key: String.init(cString: key), size: Int(size), data: result)
    }

文章就先寫到這里了,分享給同樣遇到坑的朋友泉粉。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末连霉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嗡靡,更是在濱河造成了極大的恐慌跺撼,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讨彼,死亡現(xiàn)場離奇詭異歉井,居然都是意外死亡,警方通過查閱死者的電腦和手機哈误,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門哩至,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜜自,你說我怎么就攤上這事菩貌。” “怎么了重荠?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵箭阶,是天一觀的道長。 經(jīng)常有香客問我晚缩,道長尾膊,這世上最難降的妖魔是什么媳危? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任荞彼,我火速辦了婚禮,結(jié)果婚禮上待笑,老公的妹妹穿的比我還像新娘鸣皂。我一直安慰自己,他們只是感情好暮蹂,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布寞缝。 她就那樣靜靜地躺著,像睡著了一般仰泻。 火紅的嫁衣襯著肌膚如雪荆陆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天集侯,我揣著相機與錄音被啼,去河邊找鬼幅狮。 笑死潦嘶,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播进每,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼装悲!你這毒婦竟也來了椅您?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤生闲,失蹤者是張志新(化名)和其女友劉穎媳溺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碍讯,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡褂删,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了冲茸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屯阀。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖轴术,靈堂內(nèi)的尸體忽然破棺而出难衰,到底是詐尸還是另有隱情,我是刑警寧澤逗栽,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布盖袭,位于F島的核電站,受9級特大地震影響彼宠,放射性物質(zhì)發(fā)生泄漏鳄虱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一凭峡、第九天 我趴在偏房一處隱蔽的房頂上張望拙已。 院中可真熱鬧,春花似錦摧冀、人聲如沸倍踪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽建车。三九已至,卻和暖如春椒惨,著一層夾襖步出監(jiān)牢的瞬間缤至,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工康谆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留领斥,地道東北人错洁。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像戒突,于是被迫代替她去往敵國和親屯碴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理膊存,服務發(fā)現(xiàn)导而,斷路器,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法隔崎,類相關的語法今艺,內(nèi)部類的語法,繼承相關的語法爵卒,異常的語法虚缎,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,139評論 30 470
  • 夜深了 打開收音機 來一首 少年如夢幻 眸如畫 一筆似秋辭 時已久 再見歌如泣 ——青苔【老歌】
    云了蘇閱讀 190評論 1 0
  • 淳樸的人 真不幸 他們都去見了上帝 淳樸的人 真幸福啊 他們都會見到上帝
    一味冰閱讀 298評論 0 5