iOS Swift 4.0:第三方SQLite,已經(jīng)創(chuàng)建的表格新增字段

項(xiàng)目開發(fā)過程中偎谁,可能需要給已經(jīng)創(chuàng)建的table再新增一個(gè)字段。
我的項(xiàng)目當(dāng)初是用swift寫的延都,數(shù)據(jù)庫用的是SQLite.swift蒸甜。

//工具類
class YKSQLiteManager {
    
    // MARK:- 設(shè)計(jì)單例對(duì)象
    // 1.創(chuàng)建類的實(shí)例變量
    // let是線程安全
    static let instance = YKSQLiteManager()
    
    // 2.對(duì)外提供獲取單例的接口
    // 定義類方法class func 方法名稱() -> 返回值
    class func shareInstance() -> YKSQLiteManager  {
        return instance
    }
    
    // 數(shù)據(jù)庫鏈接
    var database: Connection!
    
    init() {
        do {
            let path = NSHomeDirectory() + "/Documents/yourTable.sqlite3"
            //print("path\(path)")
            database = try Connection(path)
        } catch { print(error) }
    }
}

//我創(chuàng)建的表
struct GatewayTable {
    /// 數(shù)據(jù)庫管理者
    private let sqlManager = YKSQLiteManager.shareInstance()
    // 表
    private let tGateway = Table("tGateway_table")
    // 表字段
    let gateway_id = Expression<String>("gateway_id")
    let loc_id = Expression<String>("loc_id")

    init() {
        // 建表
        try! sqlManager.database.run(tGateway.create(ifNotExists: true, block: { t in
            t.column(gateway_id, primaryKey: true)
            t.column(loc_id)
        }))
    }
}

后續(xù)開發(fā)過程中尝抖,需要給tGateway再新增一個(gè)字段wifi_Info毡们,
SQLite中表有一個(gè)addColumn方法,于是

let wifi_Info = Expression<String>("wifi_Info")
tGateway.addColumn(wifi_Info, defaultValue: "unknown")

然后直接報(bào)錯(cuò)昧辽,閃退衙熔。果然事情沒這么簡單。

于是上網(wǎng)找搅荞,看到https://blog.csdn.net/heyuzu1/article/details/60779522這篇文章
于是

struct GatewayTable {
    /// 數(shù)據(jù)庫管理者
    private let sqlManager = YKSQLiteManager.shareInstance()
    /// 表
    private let tGateway = Table("tGateway_table")
    /// 表字段
    let gateway_id = Expression<String>("gateway_id")
    let loc_id = Expression<String>("loc_id")
    let wifi_Info = Expression<String>("wifi_Info")
    
    init() {
        // 建表
        try! sqlManager.database.run(tGateway.create(ifNotExists: true, block: { t in
            t.column(gateway_id, primaryKey: true)
            t.column(loc_id)
            t.column(wifi_Info)
        }))
        
        isWifi_InfoExist()
    }
    
    func isWifi_InfoExist() {
        
        do {
            var isExist = false
            let expression = tGateway.expression
            let colunmnNames = try sqlManager.database.prepare(expression.template,expression.bindings).columnNames
            for  colName in colunmnNames {
                if colName == "wifi_Info" {
                    isExist = true
                    break
                }
            }
            
            if !isExist {
               tGateway.addColumn(wifi_Info, defaultValue: "unknown")
            }

        } catch {
            
        }
    }

然后跑一下红氯,沒有閃退了。但是發(fā)現(xiàn)tGateway.addColumn(wifi_Info, defaultValue: "unknown")執(zhí)行結(jié)果是失敗咕痛,tGateway表沒有新增這一列痢甘。
原因在于沒有用數(shù)據(jù)庫管理去執(zhí)行這條指令啊,相當(dāng)于把代碼寫了茉贡,但是沒有編譯執(zhí)行塞栅。
于是把tGateway.addColumn(wifi_Info, defaultValue: "unknown")改成
sqlManager.database.run(tGateway.addColumn(wifi_Info, defaultValue: "unknown"))

func isWifi_InfoExist() {
        
        do {
            var isExist = false
            let expression = tGateway.expression
            let colunmnNames = try sqlManager.database.prepare(expression.template,expression.bindings).columnNames
            for  colName in colunmnNames {
                if colName == "wifi_Info" {
                    isExist = true
                    break
                }
            }
            
            if !isExist {
                do {
                    try sqlManager.database.run(tGateway.addColumn(wifi_Info, defaultValue: "unknown"))
                } catch {
                    print("addError")
                }
            }
        } catch {
            
        }
    }

這樣就可以得到想要的結(jié)果了。

//新增各種類型的一列腔丧,泛型版
class func addColumn<V:Value>(table:Table,coluName:String,column:Expression<V>,defaultValue:V) {
        do {
            var isExist = false
            let expression = table.expression
            let colunmnNames = try YKSQLiteManager.shareInstance().database.prepare(expression.template,expression.bindings).columnNames
            for  colName in colunmnNames {
                if colName == coluName {
                    isExist = true
                    break
                }
            }
            
            if !isExist {
                do {
                    try YKSQLiteManager.shareInstance().database.run(table.addColumn(column, defaultValue:defaultValue))
                } catch {
                    print("addError")
                }
            }
        } catch {
            
        }
    }

PS. swift和SQLite使用還不是很熟練放椰,如有誤,歡迎指出愉粤。

參考資料:
SQLite.swift的基本使用:http://www.reibang.com/p/30e31282c4b9
新增一列:https://blog.csdn.net/heyuzu1/article/details/60779522

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砾医,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子衣厘,更是在濱河造成了極大的恐慌如蚜,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件影暴,死亡現(xiàn)場離奇詭異错邦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)型宙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門兴猩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人早歇,你說我怎么就攤上這事√智冢” “怎么了箭跳?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長潭千。 經(jīng)常有香客問我谱姓,道長,這世上最難降的妖魔是什么刨晴? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任屉来,我火速辦了婚禮路翻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茄靠。我一直安慰自己茂契,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布慨绳。 她就那樣靜靜地躺著掉冶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脐雪。 梳的紋絲不亂的頭發(fā)上厌小,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音战秋,去河邊找鬼璧亚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛脂信,可吹牛的內(nèi)容都是我干的癣蟋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吉嚣,長吁一口氣:“原來是場噩夢啊……” “哼梢薪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尝哆,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤秉撇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后秋泄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琐馆,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年恒序,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘦麸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歧胁,死狀恐怖滋饲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喊巍,我是刑警寧澤屠缭,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站崭参,受9級(jí)特大地震影響呵曹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一奄喂、第九天 我趴在偏房一處隱蔽的房頂上張望铐殃。 院中可真熱鬧,春花似錦跨新、人聲如沸富腊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蟹肘。三九已至,卻和暖如春俯树,著一層夾襖步出監(jiān)牢的瞬間帘腹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工许饿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阳欲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓陋率,卻偏偏與公主長得像球化,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓦糟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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