SQLite在swift中的使用

前端之家收集整理的这篇文章主要介绍了SQLite在swift中的使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Swift 中使用 sqlite

准备工作

  • 添加libsqlite3.tbd
  • 创建sqlite-Bridge.h
    • sqlite3框架是一套C语言的框架,因此需要添加桥接文件
    • @H_404_19@
    • 选择项目-TARGETS-Build Settings搜索Bridg
    • Objective-C Bridging Header中输入项目名/sqlite-Bridge.h
      • 如果之前设置过桥接文件,可以直接使用
      • @H_404_19@ @H_404_19@

        编译测试

        sqliteManager

        与网络接口的独立类似,数据库的底层操作,也应该有一个独立的对象单独负责

        sqliteManager单例

        • 新建sqliteManager.swift,并且实现以下代码
        • @H_404_19@
          /// 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函数会打开数据库,如果数据库不存在,会新建一个空的数据库,并且返回数据库指针(句柄)
          • 后续的所有数据库操作,都基于此数据库句柄进行
          • @H_404_19@

            打开数据库

            • AppDelegate添加以下代码
            • @H_404_19@
              func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
              
                  sqliteManager.sharedManager.openDB("my.db")
              
                  return true
              }
              代码小结
              • sqlite数据库是直接保存在沙盒中的一个文件,只有当前应用程序可以使用
              • 在移动端开发时,数据库通常是以持久式连接方式使用的
              • 所谓持久式连接指的是只做一次打开数据库的操作,永远不做关闭数据库的操作,从而可以提高数据库的访问效率
              • @H_404_19@

                创建数据表

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

                  注意:创表操作本质上是通过执行sql语句实现的

                  • 执行sql语句函数
                  • @H_404_19@
                    /// 执行 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
                    }
                    • 创建数据表
                    • @H_404_19@
                      /// 创建数据表
                      ///
                      /// - 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函数
                      • @H_404_19@
                        if createTable() {
                            print("创表成功")
                        } else {
                            print("创表失败")
                            db = nil
                        }
                        代码小结
                        • 创表sql可以从Navicat中粘贴,然后做一些处理
                          • "替换成'
                          • 在每一行后面增加一个\n防止字符串拼接因为缺少空格造成sql语句错误
                          • 表名添加IF NOT EXISTS防止因为数据表存在出现错误
                          • @H_404_19@ @H_404_19@

                            数据模型

                            • 建立Person模型
                            • @H_404_19@
                              class Person: NSObject {
                              
                                  /// id
                                  var id: Int = 0
                                  /// 姓名
                                  var name: String?
                                  /// 年龄
                                  var age: Int = 0
                              
                                  /// 使用字典创建 Person 对象
                                  init(dict: [String: AnyObject]) {
                                      super.init()
                              
                                      setValuesForKeysWithDictionary(dict)
                                  }
                              }
                              • 新增数据
                              • @H_404_19@
                                /// 将当前对象插入到数据库
                                ///
                                /// - returns: 是否成功
                                func insertPerson() -> Bool {
                                    assert(name != nil,"姓名不能为空")
                                
                                    let sql = "INSERT INTO T_Person (name,age) VALUES ('\(name!)',\(age));"
                                
                                    return sqliteManager.sharedManager.execsql(sql)
                                }
                                • 在视图控制器添加如下代码,测试新增数据
                                • @H_404_19@
                                  /// 测试插入数据
                                  func demoInsert() {
                                      print(Person(dict: ["name": "zhangsan","age": 18]).insertPerson())
                                  }
                                  • 更新记录
                                  • @H_404_19@
                                    /// 更新当前对象在数据库中的记录
                                    ///
                                    /// - 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)
                                    }
                                    • 在视图控制器添加如下代码,测试更新数据
                                    • @H_404_19@
                                      /// 测试更新记录
                                      func demoUpdate() {
                                          print(Person(dict: ["id": 1,"name": "lisi","age": 20]).updatePerson())
                                      }
                                      • 删除数据
                                      • @H_404_19@
                                        /// 删除当前对象在数据库中的记录
                                        ///
                                        /// - returns: 是否成功
                                        func deletePerson() -> Bool {
                                            assert(id > 0,"ID 不正确")
                                        
                                            let sql = "DELETE FROM T_Person WHERE ID = \(id);"
                                        
                                            return sqliteManager.sharedManager.execsql(sql)
                                        }
                                        • 在视图控制器添加如下代码,测试删除数据
                                        • @H_404_19@
                                          /// 测试删除记录
                                          func demoDelete() {
                                              print(Person(dict: ["id": 1,"age": 20]).deletePerson())
                                          }
                                          • 测试批量插入
                                          • @H_404_19@
                                            /// 测试批量插入数据
                                            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分钟左右

猜你在找的Sqlite相关文章