微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLite在swift中的使用

Swift 中使用 sqlite

准备工作

  • 添加libsqlite3.tbd
  • 创建sqlite-Bridge.h
  • 选择项目-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("打开数据库成功")
}
代码小结

打开数据库

func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    sqliteManager.sharedManager.openDB("my.db")

    return true
}
代码小结

创建数据表

  • 如果是第一次运行,打开数据库之后,只能得到一个空的数据,没有任何的数据表
  • 为了让数据库正常使用,在第一次打开数据库后,需要执行创表操作

注意:创表操作本质上是通过执行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) == 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)
}
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,"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分钟左右

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐