Sqlite.Swift使用方式一(表結構升級方式)

模型插入方式
表結構升級方式Demo

1倔叼、創(chuàng)建路徑柴钻、創(chuàng)建數據庫

static let manager = BaseQueue()
    lazy var db: Connection = {
        let path = BaseQueue.path()
        var db = try? Connection(path)
        db?.busyTimeout = 5.0
        return db!
    }()
    private class func path() -> String{
        let path = NSHomeDirectory() + "/Documents/Caches/Sqlite"
        let file = FileManager.default
        if file.fileExists(atPath: path) == false{
            do {
                try file.createDirectory(atPath: path, withIntermediateDirectories: true, attributes: nil)
                debugPrint("create path success")
            } catch  {
                debugPrint(error.localizedDescription)
            }
        }
        return path + "DataBase.sqlite"
    }

2府怯、表格字段定義

public let dataBase : Connection = BaseQueue.manager.db//數據庫單利
private let SearchTable    = “SearchTable”//表名
//剛開始定義三個字段名或者說三列
private let id            = Expression<Int>("primaryId")
private let hotName        = Expression<String?>("hotName")
private let updateTime    = Expression<TimeInterval>("time")
//后期表結構升級可以用到
private let createTime    = Expression<TimeInterval>("createTime”)

3掂榔、創(chuàng)建一個表

    private class func addTable() -> Table{
        let tables = Table(SearchTable)
        try! dataBase.run(tables.create(ifNotExists: true, block: { (table) in
            //注意.autoincrement,如果是String必須選擇true,這里定義為自增id
            table.column(id,primaryKey: .autoincrement)
            table.column(hotName)
            table.column(updateTime)
        }))
        return tables
    }

如果不存在表就創(chuàng)建一個表
創(chuàng)建表后創(chuàng)建字段拓劝,id是主鍵

4考赛、判斷表是否有該列一罩,表結構升級需要用到

 private class func columns(table :String,column :String) -> Bool{
        do {
            var columnDatas :[String] = []
            let s = try dataBase.prepare("PRAGMA table_info(" + table + ")" )
            for row in s { columnDatas.append(row[1]! as! String) }
            let list = columnDatas.filter { (item) -> Bool in
                return item == column
            }
            return list.count > 0
        }
        catch {
            return false
        }
    }

這里可以用更高級的方法判斷

5、判斷表中是否有這個數據

private class func selectCount(keyword :String) ->Int{
        let table = addTable()
        let haveColumn = columns(table: SearchTable, column: "createTime")
        if !haveColumn {//表結構升級 添加一列createTime
            do {
                try dataBase.run(table.addColumn(createTime,defaultValue:0))
            } catch  {
                debugPrint(error)
            }
        }
        let alice = table.filter(hotName == keyword)
        do {
            let count = try dataBase.scalar(alice.count)
            debugPrint(count)
            return count
        } catch  {
            return 0
        }
    }

這里先判斷表中有沒有createTime這一列灯蝴,沒有則添加一列默認值0,最后才是查詢條數

6恢口、增加數據

public class func insertData(keyword :String,completion:@escaping ((_ success : Bool) -> Void)){
        let count = selectCount(keyword: keyword)
        if count == 0 {
            let table = addTable()
            let time : TimeInterval = NSDate ().timeIntervalSince1970
            let insertdata = table.insert(hotName <- keyword,updateTime <- time,createTime <- time)
            do {
                try dataBase.run(insertdata)
                completion(true)
            } catch  {
                debugPrint(error)
                completion(false)
            }
        }else{
            updateData(keyword: keyword, completion: completion)
        }
    }

表中有數據則修改,沒數據則添加

7穷躁、修改數據

public class func updateData(keyword :String,completion:@escaping ((_ success : Bool) -> Void)){
        let count = selectCount(keyword: keyword)
        if count == 0 {
            insertData( keyword: keyword, completion: completion)
        }else{
            let table = addTable().filter(hotName == keyword)
            let time : TimeInterval = NSDate ().timeIntervalSince1970
            let update = table.update(hotName <- keyword,updateTime <- time)
            do {
                try dataBase.run(update)
                completion(true)
            } catch  {
                debugPrint(error)
                completion(false)
            }
        }
    }

表中有數據則修改耕肩,沒數據則添加

8、刪除數據

    public class func deleteData(keyword :String,completion:@escaping ((_ success : Bool) -> Void)){
        let table = addTable()
        do {
            let alice = table.filter(hotName == keyword)
            try dataBase.run(alice.delete())
            completion(true)
        } catch {
            debugPrint(error)
            completion(false)
        }
    }
    public class func deleteData(keywords :[String],completion:@escaping ((_ success : Bool) -> Void)){
        do {
            try dataBase.transaction {
                keywords.forEach { (title) in
                    let table = addTable()
                    do {
                        let alice = table.filter(hotName == title)
                        try dataBase.run(alice.delete())
                    } catch {
                        debugPrint(error)
                    }
                }
            }
            completion(true)
        } catch  {
            completion(false)
        }
    }

使用事務來做批量刪除 操作

9问潭、數據查詢

    public class func searchData(page : Int,size : Int = 20,completion:@escaping ((_ datas : [String]) ->Void)){
        let table = addTable()
        do {
            let datas = try dataBase.prepare(table.order(updateTime.desc).limit(size, offset: (page - 1) * size))
            decodeData(listData: datas,completion: completion)
        } catch  {
            debugPrint(error)
            completion([])
        }
    }
    public class func searchData(completion:@escaping ((_ datas : [String]) ->Void)){
        let table = addTable()
        do {
            let datas = try dataBase.prepare(table)
            decodeData(listData: datas,completion: completion)
        } catch  {
            debugPrint(error)
            completion([])
        }
    }
    private class func decodeData(listData : AnySequence<Row>,completion:@escaping ((_ datas : [String]) ->Void)){
        var contentData : [String] = []
        listData.forEach { (objc) in
            let content :String = objc[hotName] ?? ""
            contentData.append(content)
        }
        completion(contentData)
    }

10猿诸、總結

a、一開始我們只創(chuàng)建 id 狡忙、hotName梳虽、updateTime,這三個字段所以我們的創(chuàng)建數據庫是如下

    private class func addTable() -> Table{
        let tables = Table(SearchTable)
        try! dataBase.run(tables.create(ifNotExists: true, block: { (table) in
            //注意.autoincrement,如果是String必須選擇true,這里定義為自增id
            table.column(id,primaryKey: .autoincrement)
            table.column(hotName)
            table.column(updateTime)
        }))
        return tables
    }

b、到某個版本的時候灾茁,需要增加一個字段createTime窜觉,這時候表中插入新數據的時候,老版本表就無法兼容北专。
所以老版本的表就需要做一個升級禀挫,就是我們的第5點。

c拓颓、當然如果用戶沒有經歷過a階段语婴,這時候對于我們來說很簡單。要么創(chuàng)建表的時候使用4個字段录粱,要么就是使用升級方案。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末画拾,一起剝皮案震驚了整個濱河市啥繁,隨后出現的幾起案子,更是在濱河造成了極大的恐慌青抛,老刑警劉巖旗闽,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異蜜另,居然都是意外死亡适室,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門举瑰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捣辆,“玉大人,你說我怎么就攤上這事此迅∑耄” “怎么了旧巾?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長忍些。 經常有香客問我鲁猩,道長,這世上最難降的妖魔是什么罢坝? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任廓握,我火速辦了婚禮,結果婚禮上嘁酿,老公的妹妹穿的比我還像新娘隙券。我一直安慰自己,他們只是感情好痹仙,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布是尔。 她就那樣靜靜地躺著,像睡著了一般开仰。 火紅的嫁衣襯著肌膚如雪拟枚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天众弓,我揣著相機與錄音恩溅,去河邊找鬼。 笑死谓娃,一個胖子當著我的面吹牛脚乡,可吹牛的內容都是我干的。 我是一名探鬼主播滨达,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼奶稠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捡遍?” 一聲冷哼從身側響起锌订,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎画株,沒想到半個月后辆飘,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡谓传,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年蜈项,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片续挟。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡紧卒,死狀恐怖,靈堂內的尸體忽然破棺而出诗祸,到底是詐尸還是另有隱情常侦,我是刑警寧澤浇冰,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站聋亡,受9級特大地震影響肘习,放射性物質發(fā)生泄漏。R本人自食惡果不足惜坡倔,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一漂佩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧罪塔,春花似錦投蝉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至佃蚜,卻和暖如春庸娱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谐算。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工熟尉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洲脂。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓斤儿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恐锦。 傳聞我的和親對象是個殘疾皇子往果,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容