// 基本步骤
// 1. 打开数据库
// 2. 处理数据
// 3. 关闭数据库
//先设置全局变量
lazy var documentsPath: String = {
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
return paths.first!
}()
//指针
var db: OpaquePointer? = nil
var stmt: OpaquePointer? = nil
// 创建或打开数据库
func createOrOpenDatabase() {
print("(NSHomeDirectory())")
//创建数据库文件路径,并要改成UTF-8类型
let path: NSString = "(documentsPath)/test.sqlite3" as NSString
let filename = path.utf8String
//判断打开数据库是否成功(若没有数据库,会自动生成),不成功则打印输入"create or open failed..."并关闭数据库
if sqlite3_open(filename, &db) != SQLITE_OK {
print("create or open failed...")
sqlite3_close(db)
}
}
// 创建学生表
func createTable() {
//拼接sql语句并转为UTF-8
let string: NSString = "create table if not exists Student(id integer primary key autoincrement, sno text, name text, score integer)"
let sql = string.utf8String
//执行sql语句
if sqlite3_exec(db, sql, nil, nil, nil) != SQLITE_OK {
print("create table failed...")
sqlite3_close(db)
}
}
//slq的新增操作
func insertStudent(sno: String, name: String, score: Int) {
// 准备SQL语句
let string: NSString = "insert into Student(sno, name, score) values(?, ?, ?)"
let sql = string.utf8String
// 解析SQL文本语句
//sqlite3_prepare_v2解析
//参数1:当前数据库指针
//参数2:要解析的sql语句(默认以0结束)
//参数3:因为sql语句默认以0结束,为了出去那个0,所以是-1
//参数4:另外一个指针用于解析后存储,最后一个参数忘了,你直接写nil就可以了
if sqlite3_prepare_v2(db, sql, -1, &stmt, nil) != SQLITE_OK {
sqlite3_close(db)
print("(sno), insert failed...")
}
// 绑定参数
let csno = (sno as NSString).utf8String
let cname = (name as NSString).utf8String
sqlite3_bind_text(stmt, 1, csno, -1, nil)
sqlite3_bind_text(stmt, 2, cname, -1, nil)
sqlite3_bind_int(stmt, 3, Int32(score))
// 执行SQL语句
if sqlite3_step(stmt) == SQLITE_ERROR {
sqlite3_close(db)
print("(sno), insert failed...")
} else {
// 释放资源
sqlite3_finalize(stmt)
}
}
// 修改学生数据
func updateStudent() {
// 准备SQL语句
let string: NSString = "update Student set score = 100 where name like 'a%'"
let sql = string.utf8String
// 执行SQL语句
//sqlite3_exec后面的三个参数可以不用关,就写nil就可以了
if sqlite3_exec(db, sql, nil, nil, nil) != SQLITE_OK {
sqlite3_close(db)
print("update failed...")
}
}
// 删除学生数据
func deleteStudents() {
// 准备SQL语句
let string: NSString = "delete from Student where score < 60"
let sql = string.utf8String
// 执行SQL语句
if sqlite3_exec(db, sql, nil, nil, nil) != SQLITE_OK {
sqlite3_close(db)
print("delete failed...")
}
}
总结:
增删改(如果没有参数,则第2,3步都不用写)
1:准备sql语句
如:let string: NSString = "insert into Student(sno, name, score) values(?, ?, ?)"
2:解析sql语句 如:sqlite3_prepare_v2(db, sql, -1, &stmt, nil)
3:绑定参数
如:let csno = (sno as NSString).utf8String
sqlite3_bind_text(stmt, 1, csno, -1, nil)
4执行语句 如:sqlite3_step(stmt)
5:释放资源 如:sqlite3_finalize(stmt)
查询
1:准备sql语句
2:解析sql语句
3: 执行SQL语句
获取每条记录的数据(某些字符类型还要转换才能显示你要的结果)
sqlite3_column_text(stmt, 0)
4:释放资源