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()}

数据库访问操作需求

  1. 建立数据库 -> 有存储数据的文件
  2. 创建数据表 -> 每一张数据表存储一类数据
  3. 利用 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
原创粉丝点击