zoukankan      html  css  js  c++  java
  • ---纯Swift的中SQLite 的使用

    SQLite.swift 是一个使用纯 Swift 语言封装 SQLite3 的操作框架。

    特性:

    • 简单的查询和参数绑定接口 

    • 安全、自动类型数据访问

    • 隐式提交和回滚接口

    • 开发者友好的错误处理和调试

    • 文档完善

    • 通过广泛测试  

    示范代码:

    import Foundation
    
    /**
        1. 打开数据库
        2. 如果没有数据表,需要首先创表
        3. 数据操作
    */
    class SQLite {
        
        var db: COpaquePointer = nil
        
        ///  打开数据库
        ///
        ///  :param: dbname 数据库名称
        ///
        ///  :returns: 是否打开成功
        func openDatabase(dbname: String) -> Bool {
            
            // UnsafePointer<Int8> UnsafePointer<CChar> 
            // 对应C语言中的 char*
            // filename 必须是完整的路径名
            let path = dbname.documentPath()
            println(path)
            
            // sqlite3_open 如果如果数据库不存在,会新建数据库文件
            // 如果数据库文件已经存在,就直接打开,返回句柄,不会对数据有任何影响
            if sqlite3_open(path, &db) == SQLITE_OK {
                println("打开数据库成功")
                
                // 本质上只需要运行一次就可以了
                if createTable() {
                    println("创表成功")
                    
                    // TODO: 测试查询数据
                    let sql = "SELECT id, DepartmentNo, Name FROM T_Department;"
                    recordSet(sql)
                } else {
                    println("创表失败")
                }
            } else {
                println("打开数据库失败")
            }
            
            return false
        }
        
        ///  创建数据表,将系统需要的数据表,一次性创建
        private func createTable() -> Bool {
            
            // 准备所有数据表的 SQL
            // 1> 每一个 SQL 完成后都有一个 ;
            // 2> 将所有创表 SQL 写在一起,每一个换行添加一个 
    
            let sql = "CREATE TABLE 
    " +
                "IF NOT EXISTS T_Department (
    " +
                "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    " +
                "DepartmentNo CHAR(10) NOT NULL DEFAULT '',
    " +
                "Name CHAR(50) NOT NULL DEFAULT '' 
    " +
                "); 
    " +
                "CREATE TABLE IF NOT EXISTS T_Employee ( 
    " +
                "'id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
    " +
                "'name' TEXT NOT NULL, 
    " +
                "'age' INTEGER NOT NULL, 
    " +
                "'department_id' INTEGER, 
    " +
                "CONSTRAINT 'FK_DEP_ID' FOREIGN KEY ('department_id') REFERENCES 'T_Department' ('id') 
    " +
            ");"
            
            return execSQL(sql)
        }
        
        ///  执行没有返回值的 SQL 语句
        ///
        ///  :param: sql SQL 字符串
        ///
        ///  :returns: 是否成功
        func execSQL(sql: String) -> Bool {
            
            /**
                1. 数据库指针
                2. SQL 字符串的 C 语言格式
                3. 回调,执行完成 SQL 指令之后的函数回调,通常都是 nil
                4. 回调的第一个参数的指针
                5. 错误信息,通常也传入 nil
            */
            return sqlite3_exec(db, sql.cStringUsingEncoding(NSUTF8StringEncoding)!, nil, nil, nil) == SQLITE_OK
        }
        
        ///  执行 SQL 返回一个结果集(对象数组)
        ///
        ///  :param: sql SQL 字符串
        func recordSet(sql: String) {
            
            // 1. 准备语句
            var stmt: COpaquePointer = nil
            /**
                1. 数据库句柄
                2. SQL 的 C 语言的字符串
                3. SQL 的 C 语言的字符串长度 strlen,-1 会自动计算
                4. stmt 的指针
                5. 通常传入 nil
            */
            if sqlite3_prepare_v2(db, sql.cStringUsingEncoding(NSUTF8StringEncoding)!, -1, &stmt, nil) == SQLITE_OK {
                
                // 单步获取SQL执行的结果 -> sqlite3_setup 对应一条记录
                while sqlite3_step(stmt) == SQLITE_ROW {
                    // 获取每一条记录的数据
                    recordData(stmt)
                }
            }
        }
        
        ///  获取每一条数据的记录
        ///
        ///  :param: stmt prepared_statement 对象
        func recordData(stmt: COpaquePointer) {
            // 获取到记录
            var count = sqlite3_column_count(stmt)
            println("获取到记录,共有多少列 (count)")
    
            // 遍历每一列的数据
            for i in 0..<count {
                let type = sqlite3_column_type(stmt, i)
                
                // 根据字段的类型,提取对应列的值
                switch type {
                case SQLITE_INTEGER:
                    println("整数 (sqlite3_column_int64(stmt, i))")
                case SQLITE_FLOAT:
                    println("小树 (sqlite3_column_double(stmt, i))")
                case SQLITE_NULL:
                    println("空 (NSNull())")
                case SQLITE_TEXT:
                    let chars = UnsafePointer<CChar>(sqlite3_column_text(stmt, i))
                    let str = String(CString: chars, encoding: NSUTF8StringEncoding)!
                    println("字符串 (str)")
                case let type:
                    println("不支持的类型 (type)")
                }
            }
        }
    }
  • 相关阅读:
    软件工程基础
    第一个微信小项目
    数据库实践
    爬虫
    模拟体育竞技
    自己的第一个网页
    科学计算和可视化
    结队项目
    自动生成小学四则运算
    自动生成小学四则运算
  • 原文地址:https://www.cnblogs.com/caicoder/p/4338599.html
Copyright © 2011-2022 走看看