SQLite在swift中的使用
来源:互联网 发布:时间碎片软件 编辑:程序博客网 时间:2024/05/20 00:49
Swift 中使用 SQLite
准备工作
- 添加
libsqlite3.tbd
- 创建
SQLite-Bridge.h
SQLite3
框架是一套C
语言的框架,因此需要添加桥接文件
- 选择
项目
-TARGETS
-Build Settings
,搜索Bridg
- 在
Objective-C Bridging Header
中输入项目名/SQLite-Bridge.h
- 如果之前设置过桥接文件,可以直接使用
编译测试
SQLiteManager
与网络接口的独立类似,数据库的底层操作,也应该有一个独立的对象单独负责
SQLiteManager
单例
- 新建
SQLiteManager.swift
,并且实现以下代码:
/// SQLite 管理器class SQLiteManager { /// 单例 static let sharedManager = SQLiteManager()}
数据库访问操作需求
- 建立数据库 -> 有存储数据的文件
- 创建数据表 -> 每一张数据表存储一类数据
- 利用
SQL 命令
实现增/删/查/改,并在 UI 中显示
建立&打开数据库
是C语言的框架,这里函数都是以sqlite3_开始的
这里sqlite3_open( 全路径, 数据库句柄),xcode7beta5全路径可以直接放入,不用转C语言,且此方法如果有数据直接打开,没数据库先建立再打开
/// 数据库句柄private var db: COpaquePointer = nil/// 打开数据库////// - parameter dbname: 数据库文件名func openDB(dbname: String) { let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString).stringByAppendingPathComponent(dbname) print(path) if sqlite3_open(path, &db) != SQLITE_OK { print("打开数据库失败") return } print("打开数据库成功")}
代码小结
- 建立数据库需要给定完整的数据库路径
sqlite3_open
函数会打开数据库,如果数据库不存在,会新建一个空的数据库
,并且返回数据库指针(句柄)- 后续的所有数据库操作,都基于此
数据库句柄
进行
打开数据库
- 在
AppDelegate
中添加以下代码
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { SQLiteManager.sharedManager.openDB("my.db") return true}
代码小结
SQLite
数据库是直接保存在沙盒中的一个文件,只有当前应用程序可以使用- 在移动端开发时,数据库通常是以
持久式
连接方式使用的 - 所谓
持久式连接
指的是只做一次打开数据库
的操作,永远不做关闭
数据库的操作,从而可以提高数据库的访问效率
创建数据表
- 如果是第一次运行,打开数据库之后,只能得到一个空的数据,没有任何的数据表
- 为了让数据库正常使用,在第一次打开数据库后,需要执行
创表
操作
注意:创表操作本质上是通过执行
SQL
语句实现的
- 执行
SQL
语句函数
/// 执行 SQL////// - parameter sql: SQL////// - returns: 是否成功func execSQL(sql: String) -> Bool { /** 参数 1. 数据库句柄 2. 要执行的 SQL 语句 3. 执行完成后的回调,通常为 nil 4. 回调函数第一个参数的地址,通常为 nil 5. 错误信息地址,通常为 nil */ return sqlite3_exec(db, sql, nil, nil, nil) == SQLITE_OK}
- 创建数据表
/// 创建数据表////// - returns: 是否成功private func createTable() -> Bool { let sql = "CREATE TABLE IF NOT EXISTS T_Person \n" + "('id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \n" + "'name' TEXT, \n" + "'age' INTEGER);" print(sql) return execSQL(sql)}
- 调整
openDB
函数
if createTable() { print("创表成功")} else { print("创表失败") db = nil}
代码小结
- 创表
SQL
可以从Navicat
中粘贴,然后做一些处理- 将
"
替换成'
- 在每一行后面增加一个
\n
防止字符串拼接因为缺少空格造成SQL
语句错误 - 在
表名
前添加IF NOT EXISTS
防止因为数据表存在出现错误
- 将
数据模型
- 建立
Person
模型
class Person: NSObject { /// id var id: Int = 0 /// 姓名 var name: String? /// 年龄 var age: Int = 0 /// 使用字典创建 Person 对象 init(dict: [String: AnyObject]) { super.init() setValuesForKeysWithDictionary(dict) }}
- 新增数据
/// 将当前对象插入到数据库////// - returns: 是否成功func insertPerson() -> Bool { assert(name != nil, "姓名不能为空") let sql = "INSERT INTO T_Person (name, age) VALUES ('\(name!)', \(age));" return SQLiteManager.sharedManager.execSQL(sql)}
- 在视图控制器添加如下代码,测试新增数据
/// 测试插入数据func demoInsert() { print(Person(dict: ["name": "zhangsan", "age": 18]).insertPerson())}
- 更新记录
/// 更新当前对象在数据库中的记录////// - returns: 是否成功func updatePerson() -> Bool { assert(name != nil, "姓名不能为空") assert(id > 0, "ID 不正确") let sql = "UPDATE T_Person SET name = '\(name!)', age = \(age) WHERE id = \(id);" return SQLiteManager.sharedManager.execSQL(sql)}
- 在视图控制器添加如下代码,测试更新数据
/// 测试更新记录func demoUpdate() { print(Person(dict: ["id": 1, "name": "lisi", "age": 20]).updatePerson())}
- 删除数据
/// 删除当前对象在数据库中的记录////// - returns: 是否成功func deletePerson() -> Bool { assert(id > 0, "ID 不正确") let sql = "DELETE FROM T_Person WHERE ID = \(id);" return SQLiteManager.sharedManager.execSQL(sql)}
- 在视图控制器添加如下代码,测试删除数据
/// 测试删除记录func demoDelete() { print(Person(dict: ["id": 1, "name": "lisi", "age": 20]).deletePerson())}
- 测试批量插入
/// 测试批量插入数据func insertManyPerson() { print("开始") let start = CFAbsoluteTimeGetCurrent() for i in 0..<100000 { Person(dict: ["name": "lisi-\(i)", "age": Int(arc4random_uniform(10)) + 20]).insertPerson() } print(CFAbsoluteTimeGetCurrent() - start)}
非常耗时,大概需要1分钟左右
0 0
- SQLite在swift中的使用
- SQLite 在 Java中的使用
- SQLite 在 Java中的使用
- SQLite在Java中的使用
- Sqlite在android中的使用
- SQLite在iOS中的使用
- Win8 sqlite 数据库在 winrt 中的使用
- SQLITE 在 ANDROID 中的详细使用
- Sqlite在Android中的简单使用
- SQLITE 源码在自己工程中的使用
- 【Unity】sqlite数据库在Unity中的使用
- sqlite数据库在Python中的使用简介
- UITextView在Swift中的使用,自适应
- @objc在swift语法中的使用场景
- JSPatch在Swift项目中的使用
- Swift泛型在协议中的使用
- (十一)swift 使用SQLite
- SQLite数据库基本使用(swift)
- java基础知识总结(一)
- 黑马程序员——面向对象
- 2015 8.20随笔
- android 点滴——XML
- 图像插值方法
- SQLite在swift中的使用
- 正则表达式语法
- java使用ffmpeg和mencoder做视频格式转换
- perl 切换cpan
- 第五课 生成学习算法
- [leetcode] 155.Min Stack
- Windows Sockets 网络编程——第十章 支持例程
- [转]URL传值带加号“+”的问题的解决方法
- 数据挖掘之关联分析六(子图模式)