前面写了一部分关于Swift的语法学习,今天要学习的是关于IOS中数据存储的一种存储方式之sqlite的使用。就Swift中操作sqlite的方法做一下,一是巩固知识点,二是为学习Swift的小伙伴提供点学习使用的sqlite的思路。扯了半会蛋了,现在言归正传,开始今天的讲解。
Swift操作sqlite的流程有如下的几个步骤:
- 建立桥接文件
- 添加library-libsqlite3.0.tbd
- 创建数据库管理工具类DBManager
- 操作数据库的简单例子
1.建立桥接文件
1.1在用Swift使用OC中得类文件的时候,需要进行桥接,首先建一个.h的头文件。
注意:桥接文件的命名规则:项目名-Bridging-Header.Swift
- #import "sqlite3.h"
1.2 在Build-settings -> Swift Complier - Code Generaton —>Objective C Briding Herder中添加自己的桥接文件。
如下图:
这样的话,桥接文件已经OK。
2.添加library-libsqlite3.0.tbd
在General - Linking frameworks And Library中添加library-libsqlite3.0.tbd。
这样就表示已经添加成功。
3.用swift实现数据库管理工具类DBManager.Swift
- //
- // DBManager.swift
- // HelloSwfit
- //
- // Created by lidong on 16/5/22.
- // Copyright © 2016年 lidong. All rights reserved.
- //
-
- /** *数据库管理 */
- class DBManager {
-
- var db: COpaquePointer = nil
-
- private static let instance = DBManager()
- // 单例 全局的数据访问接口
- class var sharedInstance: DBManager
- {
- return instance
- }
- //打开数据库
- func openDatabase(dbName: String) -> Bool
- {
- let documentPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.UserDomainMask,true)
- let documnetPath = documentPaths[0]
- print("documnetPath= \(documnetPath)")
- let error = sqlite3_open(documnetPath+dbName,&db)
- if error != sqlITE_OK {
- print("sqliteDB - Failed to open DB!")
- sqlite3_close(db)
- }
- return error == sqlITE_OK
- }
- //创建数据库表
- func createTable() -> Bool
- {
-
-
- let sql =
- "CREATE TABLE IF NOT EXISTS T_Employee ( \n" +
- "'id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n" +
- "'name' TEXT NOT NULL,\n" +
- "'age' TEXT NOT NULL,\n" +
- "'department_id' TEXT );"
- // 返回结果
- return sqlite3_exec(db,sql.cStringUsingEncoding(NSUTF8StringEncoding)!,nil,nil) == sqlITE_OK
- }
- //执行sql (插入,修改,删除)
- func execsql(sql: String) -> Bool
- {
- // 返回结果
- let d = sqlite3_exec(db,nil) == sqlITE_OK
- return d
- }
-
- func closeDb() -> Bool {
- return sqlite3_close(db) == sqlITE_OK
- }
-
-
- func selectAll(sql:String) -> Array<Employee> {
-
- var mArrs:Array<Employee> = []
- var stmt: COpaquePointer = nil
- if sqlite3_prepare_v2(db, -1,&stmt,nil) == sqlITE_OK {
-
- while sqlite3_step(stmt) == sqlITE_ROW {
- let e = Employee()
-
- let id1 = sqlite3_column_int(stmt, 0)
- print("id = \(id1)")
- let chars = UnsafePointer<CChar>(sqlite3_column_text(stmt, 1))
- let str = String(CString: chars,encoding: NSUTF8StringEncoding)!
- print("name \(str)")
-
- let chars1 = UnsafePointer<CChar>(sqlite3_column_text(stmt, 2))
- let str1 = String(CString: chars1,encoding: NSUTF8StringEncoding)!
- print("年龄 \(str1)")
-
- e.id = id1
- e.name = str
- e.age = str1
- mArrs.append(e)
- }
- sqlite3_finalize(stmt)
-
- closeDb()
- }
-
- return mArrs
-
- }
-
-
-
- /// 执行 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,nil) == sqlITE_OK {
- // 单步获取sql执行的结果 -> sqlite3_setup 对应一条记录
- while sqlite3_step(stmt) == sqlITE_ROW {
- // 获取每一条记录的数据
- recordData(stmt)
- }
- }
- }
- /// 获取每一条数据的记录
- ///
- /// :param: stmt prepared_statement 对象
- func recordData(stmt: COpaquePointer) {
- // 获取到记录
- let count = sqlite3_column_count(stmt)
- print("获取到记录,共有多少列 \(count)")
- // 遍历每一列的数据
- for i in 0..<count {
- let type = sqlite3_column_type(stmt,i)
- // 根据字段的类型,提取对应列的值
- switch type {
- case sqlITE_INTEGER:
- print("整数 \(sqlite3_column_int64(stmt,i))")
- case sqlITE_FLOAT:
- print("小数 \(sqlite3_column_double(stmt,i))")
- case sqlITE_NULL:
- print("空 \(NSNull())")
- case sqlITE_TEXT:
- let chars = UnsafePointer<CChar>(sqlite3_column_text(stmt,i))
- let str = String(CString: chars,encoding: NSUTF8StringEncoding)!
- print("字符串 \(str)")
- case let type:
- print("不支持的类型 \(type)")
- }
- }
- }
-
- }
4.操作数据库的简单用例
- //
- // sqliteViewController.swift
- // HelloSwfit
- //
- // Created by lidong on 16/5/22.
- // Copyright © 2016年 lidong. All rights reserved.
- //
-
- import UIKit
- /// sqlite的使用
- class sqliteViewController: UIViewController {
- /// 数据库名
- let db_name = "/data.db3"
-
- @IBOutlet weak var btn_submit: UIButton!
- @IBOutlet weak var age: UITextField!
- @IBOutlet weak var select: UIButton!
- @IBOutlet weak var name: UITextField!
- var dbManager : DBManager = DBManager.sharedInstance
-
- override init(nibName nibNameOrNil: String?,bundle nibBundleOrNil: NSBundle?) {
- super.init(nibName: nibNameOrNil,bundle: nibBundleOrNil)
- print(nibName);
- }
- /** 加载xib - returns: <#return value description#> */
- convenience init() {
- let nibNameOrNil = String?("sqliteViewController")
- self.init(nibName: nibNameOrNil,bundle: nil)
- }
-
-
- required init?(coder aDecoder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
-
- override func viewDidLoad() {
- super.viewDidLoad()
- self.title = "sqlite学习"
- let ddq = dbManager.openDatabase(db_name)
- print("数据打开\(ddq)")
- let sucess = dbManager.createTable()
- print("表创建=\(sucess)")
-
- self.btn_submit.addTarget(self,action:#selector( sqliteViewController.submitAge(_:)),forControlEvents: .TouchUpInside)
-
- self.btn_submit.backgroundColor = UIColor.blueColor()
-
- self.select.addTarget(self,action:#selector( sqliteViewController.selectAllEmp(_:)),forControlEvents: .TouchUpInside)
-
-
-
- }
- /** 提交雇员信息 - parameter btn: <#btn description#> */
-
- func submitAge(btn:UIButton) {
-
- let username:String! = self.name.text
-
- let age_:String! = self.age.text
-
- if (username != nil && age_ != nil){
-
-
- let sql = "insert into T_Employee(name,age) values('\(self.name.text!)','\(self.age.text!)')"
- print("sql: \(sql)")
-
- let items = dbManager.execsql(sql)
- Util.showToast(self,message: "插入 = \(items)")
-
- }else{
- Util.showToast(self,message: "输入框不能为空")
- return
- }
-
- }
- /** 查询所有雇员 - parameter btn: <#btn description#> */
-
- func selectAllEmp(btn:UIButton) {
- let sql = "select * from T_Employee"
- let items = dbManager.selectAll(sql)
- Util.showToast(self,message: "总数 = \(items.count)")
- }
- /** 更新用户信息 - parameter btn: 按钮 - parameter en: 雇员 */
- func UpDateRmp(btn:UIButton,en:Employee) {
-
- let sql = "update T_Employee set name = 'kkkk',age = '10' where id = 5"
-
- let items = dbManager.execsql(sql)
- Util.showToast(self,message: "更新 = \(items)")
- }
-
-
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- // Dispose of any resources that can be recreated.
- }
-
- }