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)")
      }
    }
  }
}
时间: 2024-12-25 11:17:38

swift中使用sqlite3的相关文章

在Swift中实现 oc与swift的混编

在Swift中想要引用OC头文件(import),可采用混编的方法,这里以sqlite为例,采用OC-Swift桥的方式实现添加头文件1引入sqlite数据库的库文件 打开工程配置文件,在build Phases选项标签的第三个选项中添加sqlite3 2.先创建桥文件 command + N键选择创建头文件 写一个名字 将要引入的文件在这个Header桥文件里进行引入就行,即将import 语句写在这里 3 配置桥接文件打开工程配置文件,在build setting选项标签搜索框里输入brid

Swift中使用SQLite的配置方法

Swift 中使用 SQLite 1.准备工作 添加 libsqlite3.dylib 创建 SQLite-Bridge.h SQLite3 框架是一套 C 语言的框架,因此需要添加桥接文件 选择 项目-TARGETS-Build Settings,搜索 Bridg 在 Objective-C Bridging Header 中输入 项目名/SQLite-Bridge.h 如果之前设置过桥接文件,可以直接使用 导入SQLite3.thd头文件 导入成功

Swift 中的Range和NSRange不同

Swift中的Ranges和Objective-C中的NSRange有很大的不同,我发现在处理Swift中Ranges相关的问题的时候,总是要花费比我想象的更多的时间.不过,现在回过头来看看,发现Swift中的Ranges的使用还是比较合理的,但是想要正确的使用Ranges真的需要一些特别的技巧. 看一个例子,下面这段代码展示的是截取以指定的字符开头和以指定的字符结尾的子字符串: ? 1 2 3 4 5 6 var str = "Hello, playground"   let ran

Swift 中的基础语法(二)

1.Swift 中的函数 /// 函数的定义 /// /// - Parameters: /// - x: 形参 /// - y: 形参 /// - Returns: 返回值 func sum(x: Int, y: Int) -> Int { return x + y } print(sum(x: 10, y: 20))   /* 外部参数就是在形参前面加了一个字 外部参数不会影响函数内部的细节 外部参数会让外部调用看起来更加直观 外部参数如果使用了'_',在外部调用函数时,会忽略形参的名字 &qu

Swift中的错误处理

前言 任何代码都会发生错误,这些错误有些是可以补救的,有些则只能让程序崩溃.良好的错误处理能够让你的代码健壮性提高,提高程序的稳定性. 本文的Swift版本:Swift 3 Objective C 返回nil 如果出错了,就返回空是Objective C中的一种常见的处理方式.因为在Objective C中,向nil发送消息是安全的.比如: - (instancetype)init { self = [super init]; if (self) { } //如果初始化失败,会返回nil ret

swift中代理的使用

下面以自定义的UITableViewCell的代理为例,记录一下swift中代理的使用 controller中的代码如 1 // 2 // ViewController.swift 3 // simpleDemo 4 // 5 // Created by liubo on 16/7/25. 6 // Copyright © 2016年 liubo. All rights reserved. 7 // 8 9 import UIKit 10 11 class ViewController: UIV

SWIFT中的repeat...while

SWIFT中的repeat...while类似于JAVA\.NET中的 do while.大同小异只是把do换成了repeat var index = 10 repeat{ print(index) index-- } while(index>0)

Swift中的结构体,类,协议,扩展和闭包的用法以及? 和 !的区别

// MARK: - 1.结构体 //1.声明一个结构体 struct Rect {    // 声明结构体变量的属性(存储属性)    var x:Float    var y:Float    var width:Float    var height:Float    // 声明结构体属性,要使用static    static var description:String?        // 声明一个计算属性(是用来专门计算结构体变量属性的setter,和getter方法,其本身没有存

Swift中编写单例的正确方式

Swift中编写单例的正确方式 2015-12-07 10:23 编辑: yunpeng.hu 分类:Swift 来源:CocoaChina翻译活动 14 10647 Objective-CSwift单例 招聘信息: Cocos2d-x 工程师 cocos2dx手游客户端主程 wp开发 iOS开发工程师 iOS软件工程师 iOS研发工程师 iOS讲师 iOS开发工程师 iOS高级开发工程师 iOS 高级软件工程师 iOS高级开发工程师 本文由CocoaChina译者leon(社区ID)翻译自kr