SQLite3是嵌入到ios中的关系型数据库。对存储大规模的数据非常实用,使得不必将每个对象加到内存中。

支持NULL、INTEGER、REAL(浮点数字)、TEXT(字符串和文本)、BLOB(二进制对象)数据类型。

1、通过Firefox中的SQLite Manager组件创建一个数据库文件,并在其中创建创建一个Table,添加相关的参数。

2、将创建好的文件推到Xcode项目中,并在Link Binary With Libraries中添加libsqlite3.dylib依赖库。

3、新建一个C语言类型文件,对话框会自动添加桥接文件,在文件中添加语句#import<sqlite3.h>。

4、然后创建一个DataBaseOperations.swift文件来管理数据库。

在DataBaseOperation.swift文件中,申明一个数据库指针。

 //不透明指针,对应C语言里面的void *,这里指sqlite3指针private var db:COpaquePointer = nil

创建一个初始化方法,在初始化方法中执行打开数据库操作。

//初始化方法打开数据库
    required init(dbPath:String){print("db path:" + dbPath)//String类的路径,转换成cStringlet cpath = dbPath.cStringUsingEncoding(NSUTF8StringEncoding)//打开数据库let error = sqlite3_open(cpath!, &db)//数据库打开失败处理if error != SQLITE_OK {sqlite3_close(db)}}

deinit{self.colseDb()}//关闭数据库
    func colseDb(){sqlite3_close(db)}

//代码创建表func createTable() -> Bool{//sql语句let sql = "CREATE TABLE UserTable(id INTEGER PRIMARY KEY  AUTOINCREMENT NOT NULL, username TEXT NOT NULL, password TEXT NOT NULL, email TEXT, age INTEGER)"//执行sql语句let execResult = sqlite3_exec(db, sql.cStringUsingEncoding(NSUTF8StringEncoding)!, nil, nil, nil);//判断是否执行成功if (execResult != SQLITE_OK) {return false}return true}

//插入一条信息func addUser(user: Person) -> Bool{//sql语句let sql = "INSERT INTO UserTable (username, password, email, age) VALUES (?, ?, ?, ?);";//sql语句转换成cString类型
        let cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding)//sqlite3_stmt 指针var stmt:COpaquePointer = nil//1.编译sqllet prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil)//判断如果失败,获取失败信息if prepare_result != SQLITE_OK {sqlite3_finalize(stmt)if let error = String.fromCString(sqlite3_errmsg(self.db)) {let msg = "SQLiteDB - failed to prepare SQL: \(sql), Error: \(error)"print(msg)self.alert(msg)}return false}//2.bind 绑定参数//第2个参数:索引从1开始//最后一个参数为函数指针sqlite3_bind_text(stmt, 1, user.name!.cStringUsingEncoding(NSUTF8StringEncoding)!, -1, nil);sqlite3_bind_text(stmt, 2, user.password!.cStringUsingEncoding(NSUTF8StringEncoding)!, -1, nil);sqlite3_bind_text(stmt, 3, user.email!.cStringUsingEncoding(NSUTF8StringEncoding)!, -1, nil);sqlite3_bind_int(stmt, 4, CInt(user.age!));//3.step执行let step_result = sqlite3_step(stmt)//判断执行结果,如果失败,获取失败信息if step_result != SQLITE_OK && step_result != SQLITE_DONE {sqlite3_finalize(stmt)if let err = String.fromCString(sqlite3_errmsg(self.db)) {let msg = "SQLiteDB - failed to execute SQL: \(sql), Error: \(err)"print(msg)self.alert(msg)}return false}//4.finalize
        sqlite3_finalize(stmt);return true}

//查询func readAllUsers() -> [Person]{//声明一个Person对象数组(查询的信息会添加到该数组)var usersArr = [Person]()//查询sql语句let sql = "SELECT * FROM UserTable;";//sqlite3_stmt 指针var stmt:COpaquePointer = nillet cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding)//1.编译sqllet prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil)if prepare_result != SQLITE_OK {sqlite3_finalize(stmt)if let error = String.fromCString(sqlite3_errmsg(self.db)) {let msg = "SQLiteDB - failed to prepare SQL: \(sql), Error: \(error)"print(msg)self.alert(msg)}return usersArr}//2.stepwhile (sqlite3_step(stmt) == SQLITE_ROW) {let user = Person()//循环 从数据库获取数据,添加到数组中let cName = UnsafePointer<CChar>(sqlite3_column_text(stmt, 0))let cPwd = UnsafePointer<CChar>(sqlite3_column_text(stmt, 1))let cEmail = UnsafePointer<CChar>(sqlite3_column_text(stmt, 2))let cAge = sqlite3_column_int(stmt, 3)user.name = String.fromCString(cName)user.password = String.fromCString(cPwd)user.email = String.fromCString(cEmail)user.age = Int(cAge)usersArr += [user]}//3.finalize
        sqlite3_finalize(stmt);return usersArr}

//更新一条信息func updateUser(name: String , toName:String) -> Bool{//更新sql语句let sql = "update UserTable set username = '\(toName)' where username = '\(name)'";//sqlite3_stmt 指针var stmt:COpaquePointer = nillet cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding)//1.编译sqllet prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil)//判断如果失败,获取失败信息if prepare_result != SQLITE_OK {sqlite3_finalize(stmt)if let error = String.fromCString(sqlite3_errmsg(self.db)) {let msg = "SQLiteDB - failed to prepare SQL: \(sql), Error: \(error)"print(msg)self.alert(msg)}return false}//2.step执行let step_result = sqlite3_step(stmt)//判断执行结果,如果失败,获取失败信息if step_result != SQLITE_OK && step_result != SQLITE_DONE {sqlite3_finalize(stmt)if let err = String.fromCString(sqlite3_errmsg(self.db)) {let msg = "SQLiteDB - failed to execute SQL: \(sql), Error: \(err)"print(msg)self.alert(msg)}return false}//4.finalize
        sqlite3_finalize(stmt);return true}

//删除一条信息func deleteUser(username: String) -> Bool{//删除sql语句let sql = "delete from UserTable  where username = '\(username)'";//sqlite3_stmt 指针var stmt:COpaquePointer = nillet cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding)//1.编译sqllet prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil)//判断如果失败,获取失败信息if prepare_result != SQLITE_OK {sqlite3_finalize(stmt)if let error = String.fromCString(sqlite3_errmsg(self.db)) {let msg = "SQLiteDB - failed to prepare SQL: \(sql), Error: \(error)"print(msg)self.alert(msg)}return false}//3.step执行let step_result = sqlite3_step(stmt)//判断执行结果,如果失败,获取失败信息if step_result != SQLITE_OK && step_result != SQLITE_DONE {sqlite3_finalize(stmt)if let err = String.fromCString(sqlite3_errmsg(self.db)) {let msg = "SQLiteDB - failed to execute SQL: \(sql), Error: \(err)"print(msg)self.alert(msg)}return false}//4.finalize
        sqlite3_finalize(stmt);return true}

//定义一个报警器
    func alert(msg:String) {dispatch_async(dispatch_get_main_queue()) {let alert = UIAlertView(title: "SQLiteDB", message:msg, delegate: nil, cancelButtonTitle: "OK")alert.show()}}

因为工程数据库文件打包之后,会在NSBundle.mainBundle()路径下,该路径是只读的,不允许修改,所以必须把该路径下的数据库拷贝一份到Documents路径下,以后整个工程都将操作Documents路径下的数据库。

在ViewController中,添加一下代码。

//声明一个Documents下的路径let dbPath = NSHomeDirectory() + "/Documents/RWDataTest.sqlite"//判断数据库文件是否存在if !NSFileManager.defaultManager().fileExistsAtPath(dbPath){//获取安装包内数据库路径let bundleDBPath = NSBundle.mainBundle().pathForResource("RWDataTest", ofType: "sqlite")!//将安装包内数据库拷贝到Documents目录下do{try NSFileManager.defaultManager().copyItemAtPath(bundleDBPath, toPath: dbPath)}catch let error as NSError {print(error)//如果创建失败,error 会返回错误信息
            }}

//打开数据库let dbOperation = DatabaseOperations(dbPath: dbPath)//添加一张表
        dbOperation.createTable();//插入一条信息, 通过Person对象来传值let person:Person = Person(name: "刘明洋", pwd: "liumingyang", email: "liumingyang@leadingdo.com", age: 30)dbOperation.addUser(person)//查询let personArray:[Person] = dbOperation.readAllUsers()print("共搜索到:\(personArray.count) 条数据" )//更新dbOperation.updateUser("刘明洋", toName: "刘蕙通")//删除dbOperation.deleteUser("刘蕙通")//关闭数据库dbOperation.colseDb()

读写应用程序数据-SQLite3相关推荐

  1. 读写应用程序数据-NSUserDefault、对象归档(NSKeyedArchiver)、文件操作

    ios中数据持久化存储方式一般有5种:NSUserDefault.对象归档(NSKeyedArchiver).文件操作.数据库存储(SQLite3).CoreData. 1.NSUserDefault ...

  2. < Android数据存储> 任务二 应用程序数据文件夹里的文件读写

    :zh]Android中提供了两个方法用来打开应用程序的数据文件夹IO流. 1.FileInputStream openFileInput(String name):参数name表示某个文件名,该方法 ...

  3. 5 Android数据存储 任务二 应用程序数据文件夹里的文件读写 ,

    Android中提供了两个方法用来打开应用程序的数据文件夹IO流. 1.FileInputStream openFileInput(String name):参数name表示某个文件名,该方法用于打开 ...

  4. linux读取sd卡文件数据,Linux系统和SD卡读写部分程序.doc

    Linux系统和SD卡读写部分程序 11.1.1 SD卡系统概念 Linux系统移植>第11章SD卡驱动移植,本章重点为SD卡协议介绍和SD卡驱动分析,后面也介绍SD卡驱动移植过程.随着SD卡存 ...

  5. s7 200 java_java android 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC...

    本文将使用一个gitHub开源的组件技术来读写西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 gi ...

  6. 16F877A和24C02通信汇编语言,PIC16f877A读写24c02程序

    PIC16f877A读写24c02程序 来源:-- 作者:-- 浏览:389 时间:2016-08-10 14:18 标签: 摘要: PIC16f877A读写24c02程序 #include  #in ...

  7. 24c512 c语言程序,msp430读写24c512程序

    原标题:msp430读写24c512程序 *文件名: f169i2c.c *整体描述:MSP430F169硬件IIC软件,字节方式,主方式 * IIC接口:P3.3=SCL,P3.1=SDA;(开漏输 ...

  8. C#读写三菱PLC数据 使用TCP/IP 协议

    本文将使用一个Github开源的组件库技术来读写三菱PLC和西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能 ...

  9. 串口调试助手读写三菱fx3u数据_C#读写三菱Fx PLC 使用Fx 串口协议 读写Fx3U设备

    本文将使用一个Github开源的组件库技术来读写三菱 FX PLC,使用的是基于串口的实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 github地 ...

最新文章

  1. 轻松易懂的缓存雪崩、穿透、击穿以及解决方案
  2. 深度学习专家Karpathy加入特斯拉,或将负责自动驾驶视觉研究
  3. 华为鸿蒙第一期名单,机型正式确认,鸿蒙2.0第一批名单曝光!花粉:华为不够厚道...
  4. UFLDL 教程学习笔记(一)
  5. CV学习笔记-BP神经网络训练实例(含详细计算过程与公式推导)
  6. 基于三层结构的CRM系统(Agent X)的设计和开发
  7. win10下安装SQL2000
  8. 使用第三方广告服务器的好处
  9. 设置老版版谷歌浏览器自动启用flash
  10. MMC / eMMC / SD
  11. TDengine 单节点Cluster not ready( 群集未就绪) 异常问题分析及解决方案
  12. AC自动机模板(【洛谷3808】)
  13. 国内4种常用日内CTA策略介绍及实现
  14. linux退出guest用户_用户、组及其它 Linux 特性 | Linux 中国
  15. python中超集、子集、并集、交集、差集等
  16. 上号神器扫码教程,常见问题解答
  17. QQ侧滑菜单的实现和拓展-DrawerLayout
  18. git master、origin master 与 origin/master 的区别
  19. 治数如治水,数据治理和数据创新难在哪?
  20. 简洁大气用户登录页面手机端模板

热门文章

  1. java batch批量
  2. error: index-pack died of signal fatal: index-pack failed【Git】
  3. sql查询,nolock写还是不写,这是一个问题
  4. 马哥2013年运维视频笔记 day02 Linux系统常识
  5. 24个很赞的 Node.js 免费教程和在线指南
  6. Objective-C中.h、.m、.mm的区别
  7. 2006.08.10
  8. 易语言---字符串操作
  9. OpenCV Canny边缘检测
  10. java的快速开发框架