前面写了一部分关于Swift的语法学习,今天要学习的是关于IOS中数据存储的一种存储方式之sqlite的使用。就Swift中 *** 作sqlite的方法做一下,一是巩固知识点,二是为学习Swift的小伙伴提供点学习使用的sqlite的思路。扯了半会蛋了,现在言归正传,开始今天的讲解。
Swift *** 作sqlite的流程有如下的几个步骤:
- 建立桥接文件
- 添加library-libsqlite3.0.tbd
- 创建数据库管理工具类DBManager
- *** 作数据库的简单例子
1.1在用Swift使用OC中得类文件的时候,需要进行桥接,首先建一个.h的头文件。
注意:桥接文件的命名规则:项目名-BrIDging-header.Swift
#import "sqlite3.h"
1.2 在Build-settings -> Swift ComplIEr - Code Generaton —>Objective C BrIDing Herder中添加自己的桥接文件。
如下图:
这样的话,桥接文件已经OK。
在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. }}
总结:sqlIte的学习基本就是从这四个步骤来实现。有疑问可以,在下面评论。
代码地址:
@H_404_322@ 总结以上是内存溢出为你收集整理的Swift学习第九q之SQLite的使用全部内容,希望文章能够帮你解决Swift学习第九q之SQLite的使用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)