sqlite的增删改查

// 基本步骤
// 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:释放资源
posted @ 2016-12-16 13:47  有缘无分的朋友  阅读(435)  评论(0编辑  收藏  举报