項(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