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 ...
随机推荐
- RequiredFieldValidator的使用
特別說明:1.一個Button要對頁面的多個控件進行驗證,則需要設置button和其它受控控件的ValidationGroup屬性 aspx頁面實例: <tr class="h&quo ...
- 一款APP从设计稿到切图过程全方位揭秘 Mark
纯干货!一款APP从设计稿到切图过程全方位揭秘 @BAT_LCK:我本身是一名GUI设计师,所以我只站在GUI设计师的角度去把APP从项目启动到切片输出的过程写一写,相当于工作流程的介绍吧.公司不 ...
- xcode import<xx/xx.h> 头文件报错
最近一直在写Android程序,有点久没用xcode,在写一个项目准备把 UI7Kit导进去,将iOS 7的界面适配到低版本的时候,出现了这么一个蛋疼的问题.稍微查了一下,新建项目的时候想先做一个li ...
- 不定高度的div背景或背景图片不显示问题
在使用div+css进行网页布局时,如果外部div有背景颜色或者边框,而不设置其高度,在IE浏览器下显示正常.但是使用Firefox/opera浏览时却出现最外层Div的背景颜色和边框不起作用的问题. ...
- dom 按着shift多选
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 【多线程】Java线程面试题 Top 50(转载)
Java线程面试题 Top 50 原文链接:http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎 ...
- WebBrowser的各种使用方法(未完待续)(XE8+WIN7)
相关资料: 占时想不起来了,有时间我补上吧. 程序下载: http://download.csdn.net/detail/zhujianqiangqq/9666390 实例代码: unit Unit1 ...
- C#实现office文档转换为PDF或xps的一些方法( 转)
源博客http://blog.csdn.net/kable999/article/details/4786654 代码支持任意office格式 需要安装office 2007 还有一个office20 ...
- svn switch relocate用法
svn info svn info 得到 Path: . Working Copy Root Path: /Users/chunhuizhao/phpworkspace/buptef_wxpay/tr ...
- react native 网络get请求方式参数不可为undefined或null
react native 网络get请求方式参数不可为undefined(为空的话默认变为)或null 错误写法: export function addToCartAction(isRefreshi ...