iOS开发——数据持久化Swift篇&(三)SQLite3
SQLite3
使用
//******************** 5.3 SQLite3存储和读取数据 func use_SQLite3() { //声明一个Documents下的路径 var dbPath = NSHomeDirectory() + "/Documents/SwiftClassDB.sqlite" //判断数据库文件是否存在 if !NSFileManager.defaultManager().fileExistsAtPath(dbPath) { //获取安装包内数据库路径 var bundleDBPath:String? = NSBundle.mainBundle().pathForResource("SwiftClassDB", ofType: "sqlite") //将安装包内数据库拷贝到Documents目录下 NSFileManager.defaultManager().copyItemAtPath(bundleDBPath!, toPath: dbPath, error: nil) } //打开数据库 let dbOperation = DatabaseOperations(dbPath: dbPath) //添加一张表 dbOperation.createTable(); //插入一条信息, 通过Person对象来传值 let person:Person = Person(name: ) dbOperation.addUser(person) //查询 let personArray:[Person] = dbOperation.readAllUsers() println("共搜索到:\(personArray.count) 条数据" ) //更新 dbOperation.updateUser("刘明洋", toName: "刘蕙通") //删除 dbOperation.deleteUser("刘蕙通") //关闭数据库 dbOperation.colseDb() } //******************** 5.4 Core Data func use_CoreData() { //参见工程 LMYCoreData }
数据操作
class DatabaseOperations { //不透明指针,对应C语言里面的void *,这里指sqlite3指针 private var db:COpaquePointer = nil //初始化方法打开数据库 required init(dbPath:String) { println("db path:" + dbPath) //String类的路径,转换成cString let 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语句 var sql = "CREATE TABLE UserTable(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, username TEXT NOT NULL, password TEXT NOT NULL, email TEXT, age INTEGER)" //执行sql语句 var execResult = sqlite3_exec(db, sql.cStringUsingEncoding(NSUTF8StringEncoding)!, nil, nil, nil); //判断是否执行成功 if (execResult != SQLITE_OK) { return false } return true } //插入一条信息 func addUser(user: Person) -> Bool { //sql语句 var sql = "INSERT INTO UserTable (username, password, email, age) VALUES (?, ?, ?, ?);"; //sql语句转换成cString类型 var cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding) //sqlite3_stmt 指针 var stmt:COpaquePointer = nil //1.编译sql let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -, &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)" println(msg) self.alert(msg) } return false } let intTran = UnsafeMutablePointer<Int>(bitPattern: -) let tranPointer = COpaquePointer(intTran) let transient = CFunctionPointer<((UnsafeMutablePointer<()>) -> Void)>(tranPointer) //2.bind 绑定参数 //第2个参数:索引从1开始 //最后一个参数为函数指针 sqlite3_bind_text(stmt, , user.name!.cStringUsingEncoding(NSUTF8StringEncoding)!, -, transient); sqlite3_bind_text(stmt, , user.password!.cStringUsingEncoding(NSUTF8StringEncoding)!, -, transient); sqlite3_bind_text(stmt, , user.email!.cStringUsingEncoding(NSUTF8StringEncoding)!, -, transient); sqlite3_bind_int(stmt, , CInt(user.age!)); //3.step执行 var 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)" println(msg) self.alert(msg) } return false } //4.finalize sqlite3_finalize(stmt); return true } //查询 func readAllUsers() -> [Person]{ //声明一个Person对象数组(查询的信息会添加到该数组) var usersArr = [Person]() //查询sql语句 var sql = "SELECT * FROM UserTable;"; //sqlite3_stmt 指针 var stmt:COpaquePointer = nil var cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding) //1.编译sql let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -, &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)" println(msg) self.alert(msg) } return usersArr } //2.step while (sqlite3_step(stmt) == SQLITE_ROW) { var user = Person() //循环 从数据库获取数据,添加到数组中 let cName = UnsafePointer<CChar>(sqlite3_column_text(stmt, )) let cPwd = UnsafePointer<CChar>(sqlite3_column_text(stmt, )) let cEmail = UnsafePointer<CChar>(sqlite3_column_text(stmt, )) let cAge = sqlite3_column_int(stmt, ) 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语句 var sql = "update UserTable set username = '\(toName)' where username = '\(name)'"; //sqlite3_stmt 指针 var stmt:COpaquePointer = nil var cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding) //1.编译sql let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -, &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)" println(msg) self.alert(msg) } return false } //3.step执行 var 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)" println(msg) self.alert(msg) } return false } //4.finalize sqlite3_finalize(stmt); return true } //删除一条信息 func deleteUser(username: String) -> Bool { //删除sql语句 var sql = "delete from UserTable where username = '\(username)'"; //sqlite3_stmt 指针 var stmt:COpaquePointer = nil var cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding) //1.编译sql let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -, &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)" println(msg) self.alert(msg) } return false } //3.step执行 var 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)" println(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() } } }
iOS开发——数据持久化Swift篇&(三)SQLite3的更多相关文章
- iOS开发——数据持久化Swift篇&使用Core Data进行数据持久化存储
使用Core Data进行数据持久化存储 一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成 ...
- iOS开发——数据持久化Swift篇&(二)沙盒文件
沙盒文件 //******************** 5.2 文件操作 func use_FileOperations() { //1.获取程序的Home目录 let homeDirectory = ...
- iOS开发——数据持久化Swift篇&(一)NSUserDefault
NSUserDefault //******************** 5.1 NSUserDefault和对象归档 func useNSUserDefault() { //通过单利来创建一个NSU ...
- iOS开发——数据持久化Swift篇&文件目录路径获取(Home目录,文档目录,缓存目录等)
文件目录路径获取(Home目录,文档目录,缓存目录等) iOS应用程序只能在自己的目录下进行文件的操作,不可以访问其他的存储空间,此区域被称为沙盒.下面介绍常用的程序文件夹目录: 1,Home ...
- iOS开发——数据持久化Swift篇&iCloud云存储
iCloud云存储 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super. ...
- iOS开发——数据持久化Swift篇&SettingBundle
SettingBundle import UIKit class ViewController: UIViewController { var userDefault = NSUserDefaults ...
- iOS开发——数据持久化Swift篇&(四)CoreData
CoreData import CoreData class ViewController: UIViewController { override func viewDidLoad() { supe ...
- iOS开发——数据持久化Swift篇&通用文件存储
通用文件存储 import UIKit class ViewController: UIViewController { @IBOutlet weak var textField: UITextFie ...
- iOS开发——数据持久化Swift篇&模型对象归档
模型对象归档 import UIKit class ViewController: UIViewController { @IBOutlet weak var textField: UITextFie ...
随机推荐
- Arduino uno R3 ISP刷Rootloader for arduino pro mini
找了好久才发现的,好东西.介绍怎么使用uno对mini 刷Rootloader **SOLUTION** Reinstall the Arduino Pro Mini Bootloader using ...
- [ZZ] C++ pair
Pair类型概述 pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair<int, string> a; 表示a中有两个类型,第一个元素是int型的 ...
- 第二百零九天 how can I 坚持
上班感觉好空虚啊. 今天感觉也没有什么,只是感觉上班的时候闲了一天,下班的时候就来事了. 确实没什么,只是上班的时候突然感觉好失落. 不该胡扯,朱镕基,言必行. 还有中国高铁谈判的新闻,中国确实是个比 ...
- Rdlc报表出现空白页解决方法
在使用RDLC报表时,碰到这种情况:当只有一页数据时,报表确显示两页,第二页除了报表头之外数据为空.然后,当有多页数据时,最后一页为空. RDLC報表設計好後,在ReportViewer預覽報表時,頁 ...
- 常见的mongo shell命令
启动mongo shell 在windows下,双击mongo.exe可以启动mongo shell 查询库.表及选择库 查询所有库命令: show dbs 应用某一个db use jxs_datab ...
- JavaIO(06)文件复制
文件复制一般是采用两种方式进行操作: 1:将源文件中的内容全部读取到内存中,并一次性的写入到目标文件中:(不常用这种方式) 2:不将源文件中的内容全部读取进来,而是采用边读边写的方式: 实例01: ...
- Memcached 实例
建立Manager类 package com.alisoft.sme.memcached; import java.util.Date; import com.danga.MemCached.MemC ...
- 深入DNS
什么是DNS? 我说前面说过http如何发送请求.这里的第一步就是将域名变为ip地址 如何将域名变为ip地址我们就得用到域名解析(DNS). 如何进行域名解析的? 第一步:在浏览器的url里输入域名, ...
- PowerDesigner 表视图修改
PowerDesigner中Table视图同时显示Code和Name,像下图这样的效果: 实现方法:Tools-Display Preference 转自:http://www.shaoqun.com ...
- 妙用缓存调用链实现JS方法的重载
来自于我的博客http://sweets.cf/,转载注明出处 1.什么是方法重载 方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数. 简而言之就是:方法重载就 ...