1. 打開數(shù)據(jù)庫(kù):sqlite3_open
/**
* sqlite3_open 使用這個(gè)函數(shù)打開一個(gè)數(shù)據(jù)庫(kù)
* 參數(shù)一: 需要打開的數(shù)據(jù)庫(kù)文件路徑
* 參數(shù)二: 一個(gè)指向SQlite3數(shù)據(jù)結(jié)構(gòu)的指針, 到時(shí)候操作數(shù)據(jù)庫(kù)都需要使用這個(gè)對(duì)象
* 功能作用: 如果需要打開數(shù)據(jù)庫(kù)文件路徑不存在, 就會(huì)創(chuàng)建該文件;如果存在, 就直接打開; 可通過返回值, 查看是否打開成功
*/
if sqlite3_open(fileName, &db) == SQLITE_OK {
// print("打開數(shù)據(jù)庫(kù)成功")
if createTable() {
print("創(chuàng)建表成功")
} else {
print("創(chuàng)建表失敗")
}
} else {
print("打開數(shù)據(jù)庫(kù)失敗")
}
}
2.執(zhí)行語(yǔ)句: sqlite3_exec
/// 創(chuàng)建表
fileprivate func createTable() -> Bool {
// 創(chuàng)建sqlite語(yǔ)句
let sql = "create table if not exists t_stu(name text, age integer, score real, id integer primary key autoincrement)"
// 執(zhí)行SQL語(yǔ)句
// 參數(shù)一: 數(shù)據(jù)庫(kù)
// 參數(shù)二: 需要執(zhí)行的SQL語(yǔ)句
// 參數(shù)三: 回調(diào)結(jié)果, 執(zhí)行完畢之后的回調(diào)函數(shù), 如果不需要 置為NULL
// 參數(shù)四: 參數(shù)三的第一個(gè)參數(shù), 刻意通過這個(gè)傳值給回調(diào)函數(shù) 如果不需要 置為NULL
// 參數(shù)五: 錯(cuò)誤信息, 通過傳遞一個(gè)地址, 賦值給外界, 如果不需要 置為NULL
let result = sqlite3_exec(db, sql, nil, nil, nil) == SQLITE_OK
return result
}
3. 創(chuàng)建準(zhǔn)備語(yǔ)句:sqlite3_prepare_v2
/ 1.創(chuàng)建準(zhǔn)備語(yǔ)句
/*
創(chuàng)建一個(gè)“準(zhǔn)備語(yǔ)句”,編譯好的sql 字符串
參數(shù)一:一個(gè)已經(jīng)打開的數(shù)據(jù)庫(kù)對(duì)象
參數(shù)二:需要編譯的sql 字符串
參數(shù)三:取出sql 字符串的長(zhǎng)度 -1 代表自動(dòng)計(jì)算
參數(shù)四:“準(zhǔn)備語(yǔ)句”砸逊,后期操作的對(duì)象
參數(shù)五:通過參數(shù)3 取出參數(shù)2 剩余的長(zhǎng)度的字符串
*/
/// 用來存儲(chǔ)嘹朗,已經(jīng)編譯號(hào)的準(zhǔn)備語(yǔ)句
var stmt: OpaquePointer? = nil
if sqlite3_prepare_v2(db, sql, -1, &stmt, nil) != SQLITE_OK {
print("準(zhǔn)備語(yǔ)句創(chuàng)建失敗")
sqlite3_finalize(stmt)
return false
}
4.綁定參數(shù)
/*
綁定一個(gè)字符串到準(zhǔn)備語(yǔ)句里
參數(shù)一:準(zhǔn)備語(yǔ)句
參數(shù)二:綁定值的索引腔寡,從 1 開始
參數(shù)三:需要綁定的值
參數(shù)四:取出參數(shù)3 的多少長(zhǎng)度 -1 自動(dòng)計(jì)算
參數(shù)五:代表參數(shù)的處理方式
#define SQLITE_STATIC 函數(shù)內(nèi)部處理:參數(shù)是一個(gè)敞亮旺拉,不會(huì)被釋放,所以就不會(huì)額外的再次引用該參數(shù)
#define SQLITE_TRANSIENT 函數(shù)內(nèi)部處理:參數(shù)是一個(gè)臨時(shí)的變量吕喘,后期有可能被修改或釋放毅否,所以函數(shù)內(nèi)部會(huì)對(duì)參數(shù)做一次引用處理,一旦使用完畢评雌,內(nèi)部會(huì)釋放
*/
// 不安全的按位轉(zhuǎn)換
// 使用這個(gè)函數(shù)的前提:必須明確知道树枫,值真正的數(shù)據(jù)類型
let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
for obj in valueArray {
switch obj {
case is String:
sqlite3_bind_text(stmt, 1, obj as! String, -1, SQLITE_TRANSIENT)
case is Int:
sqlite3_bind_int(stmt, 2, Int32(obj as! Int))
case is Double:
sqlite3_bind_double(stmt, 3, obj as! Double)
default:
break
}
}
5.執(zhí)行準(zhǔn)備語(yǔ)句:sqlite3_step
if sqlite3_step(stmt) == SQLITE_DONE {
// print("執(zhí)行成功")
}
6.重置語(yǔ)句:sqlite3_reset
sqlite3_reset(stmt)
7. 銷毀對(duì)象:sqlite3_finalize
sqlite3_finalize(stmt)
具體操作,請(qǐng)點(diǎn)擊 demo