Swift 中使用 SQLite
准备工作
- 添加
libsqlite3.tbd
- 创建
SQLite-Bridge.h
SQLite3 框架是一套C 语言的框架,因此需要添加桥接文件
- 选择
项目 -TARGETS -Build Settings ,搜索Bridg
- 在
Objective-C Bridging Header 中输入项目名/SQLite-Bridge.h
编译测试
SQLiteManager
与网络接口的独立类似,数据库的底层操作,也应该有一个独立的对象单独负责
SQLiteManager 单例
- 新建
SQLiteManager.swift ,并且实现以下代码:
class SQLiteManager {
static let sharedManager = SQLiteManager()
}
数据库访问操作需求
- 建立数据库 -> 有存储数据的文件
- 创建数据表 -> 每一张数据表存储一类数据
- 利用
SQL 命令 实现增/删/查/改,并在 UI 中显示
建立&打开数据库
是C语言的框架,这里函数都是以sqlite3_开始的
这里sqlite3_open( 全路径, 数据库句柄),xcode7beta5全路径可以直接放入,不用转C语言,且此方法如果有数据直接打开,没数据库先建立再打开
private var db: COpaquePointer = nil
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 函数会打开数据库,如果数据库不存在,会新建一个空的数据库 ,并且返回数据库指针(句柄)
- 后续的所有数据库操作,都基于此
数据库句柄 进行
打开数据库
func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
SQLiteManager.sharedManager.openDB("my.db")
return true
}
代码小结
SQLite 数据库是直接保存在沙盒中的一个文件,只有当前应用程序可以使用
- 在移动端开发时,数据库通常是以
持久式 连接方式使用的
- 所谓
持久式连接 指的是只做一次打开数据库 的操作,永远不做关闭 数据库的操作,从而可以提高数据库的访问效率
创建数据表
- 如果是第一次运行,打开数据库之后,只能得到一个空的数据,没有任何的数据表
- 为了让数据库正常使用,在第一次打开数据库后,需要执行
创表 操作
注意:创表操作本质上是通过执行SQL 语句实现的
func execSQL(sql: String) -> Bool {
return sqlite3_exec(db,sql,nil,nil) == SQLITE_OK
}
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)
}
if createTable() {
print("创表成功")
} else {
print("创表失败")
db = nil
}
代码小结
- 创表
SQL 可以从Navicat 中粘贴,然后做一些处理
- 将
" 替换成'
- 在每一行后面增加一个
n 防止字符串拼接因为缺少空格造成SQL 语句错误
- 在
表名 前添加IF NOT EXISTS 防止因为数据表存在出现错误
数据模型
class Person: NSObject {
var id: Int = 0
var name: String?
var age: Int = 0
init(dict: [String: AnyObject]) {
super.init()
setValuesForKeysWithDictionary(dict)
}
}
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())
}
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())
}
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,"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分钟左右
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|