---纯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 写在一起,每一个换行添加一个 \n
        let sql = "CREATE TABLE \n" +
            "IF NOT EXISTS T_Department (\n" +
            "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n" +
            "DepartmentNo CHAR(10) NOT NULL DEFAULT ‘‘,\n" +
            "Name CHAR(50) NOT NULL DEFAULT ‘‘ \n" +
            "); \n" +
            "CREATE TABLE IF NOT EXISTS T_Employee ( \n" +
            "‘id‘ INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \n" +
            "‘name‘ TEXT NOT NULL, \n" +
            "‘age‘ INTEGER NOT NULL, \n" +
            "‘department_id‘ INTEGER, \n" +
            "CONSTRAINT ‘FK_DEP_ID‘ FOREIGN KEY (‘department_id‘) REFERENCES ‘T_Department‘ (‘id‘) \n" +
        ");"

        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)")
            }
        }
    }
}
时间: 2025-01-01 08:06:05

---纯Swift的中SQLite 的使用的相关文章

纯 Swift 封装的 SQLite 框架:SQLite.swift

SQLite.swift 是一个使用纯 Swift 语言封装 SQLite3 的操作框架. 特性: 简单的查询和参数绑定接口 安全.自动类型数据访问 隐式提交和回滚接口 开发者友好的错误处理和调试 文档完善 通过广泛测试 示例代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import SQLite   let db = Database("

Swift 项目中常用的第三方框架

Swift 项目中可能用到的第三方框架 字数1004 阅读4091 评论17 喜欢93 这里记录下swift开发中可能用的框架 , 最近浏览了不少,积累在这里,以后用的时候方便查阅.顺便推荐给大家! 这里的框架都是纯swift的 , 感谢开源 ,感谢大神们 . 下拉刷新 BreakOutToRefresh 一个下拉刷新打砖块的swift库 SDRefreshView 简单易用的上拉和下拉刷新 ZLSwiftRefresh - 下拉刷新/上拉加载更多,支持自定义动画,集成简单 GearRefres

c++中sqlite中文路径创建数据库失败的问题

 sqlite3里面使用的是utf-8的编码,所以在创建数据库的时候若果路径是纯英文字母和数字的话,那么多ansii和utf-8编码是一样的,这个时候sqlite3_open函数的调用完全没问题.但是如果是中文的话asnsii直接转化为Utf-8就会出错, 找不到路径,从而创建或者打开数据库失败.解决的方法如下: //sdk中可以直接从UNICODE转为utf-8,不能直接从ansii转为utf-8 //所以 Ansii要转为Utf-8, 需要先转为UNICODE 再转为utf-8 void U

Android中SQLite事务的操作

1.创建一个数据库帮助类. package com.wzw.sqllitedemo.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.

android中SQLite数据库的增删改查

1.数据库帮助类PersonSQLiteOpenHelper package com.wzw.sqllitedemo.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper

Swift语言中的泛型编程 【Generic】【Part 1】

泛型  泛型编程让你可以编写更具扩展性.易重用的功能,代码使用时的类型取决于你所定义的业务需求.你可以编写避免重复的代码,目标更加清晰明确,风格抽象. 泛型是Swift语言的一项强大的特性,基本上所有的swift标准库都建立在泛型代码上.实际上,你在这本书的时候不知不觉地接触到泛型,它贯穿始终.例如Swift的数组和字典类型都是泛型集合.你可以创建用于存放整数值的数组,也创建数组存储字符串,其他所有能在Swift中创建的类型都可以创建到数组中.类似的,你可以创建字典来存储数值或其他指定的类型,毫

Swift编程语言中的方法引用(基于2.2版本)

由于Apple官方的<The Swift Programming Guide>对Swift编程语言中的方法引用介绍得不多,所以这里将更深入.详细地介绍Swift中的方法引用. Swift与Objective-C不同,由于Objective-C的方法都属于“消息”,因此直接用selector的消息签名即可表示一条确定的消息作为方法引用.而Swift的方法更类似于C++.Java中的方法,也就是说比Objective-C更静态,因此它不具有如此般灵活性. 另外,在Swift编程语言中,方法引用与C

Swift语言中的属性,方法,下标脚本以及继承

从这篇章节起,Swift编程语言指南大部分的重要内容在于概念,代码并不是太多.理解Swift的面向对象理念,语法以及类结构,构造析构过程对于很好的应用Swift语言将会有比较大的帮助. 属性 存储属性 存储属性通常是那些可以通过直接赋值,或者直接访问成员能够获得的属性类型. 它有些要注意的地方: 若一个结构体被声明为常量,则子属性无法被修改了.在Objective-C中,我们总是无法修改结构体的子属性,但是swift却可以,不过这种情况是个例外,当你存储型属性是个结构体并且是个常量,那你就不要再

Android中SQLite数据库的简单使用

File file = new File("hah.txt"); //只是创建了一个对象file, file指向了hah.txt这个文件,hah.txt这个文件可能存在,也可能不存在.如果文件不存在,则不会被创建. 必须要有文件输出流对文件进行了写的操作,文件才会被创建. 游标:在访问数据库中表结构时,想访问表中的某一行的时候,数据库内部有一个快速的定位方式,这个定位方式是通过索引来实现的.游标相当于数组的指针,通过游标的上下移动来查找数据. 在Android中使用SQLite数据库,