美文网首页
SQLite数据库框架之FMDB(Swift)

SQLite数据库框架之FMDB(Swift)

作者: 6ffd6634d577 | 来源:发表于2016-04-24 19:08 被阅读699次

    FMDB使用

    • FMDB是iOS平台的SQLite数据库框架
    • FMDB以OC的方式封装了SQLite的C语言API
    FMDB的优点
    • 使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
    • 对比苹果自带的Core Data框架,更加轻量级和灵活
    • 提供了多线程安全的数据库操作方法,有效地防止数据混乱

    使用框架

    use_frameworks!
    pod 'FMDB'
    

    核心类

    • FMDB核心类:
    • FMDatabase: 一个FMDatabase表示一个sqlite数据库.所有对数据库的操作都是通过这个类
    • executeStatements: 执行多条sql
    *  executeQuery: 执行查询语句
    *  executeUpdate: 执行除查询以外的语句,create, drop, insert, delete, update
    
    • FMDatabaseQueue: 内部封装FMDatabase和串行queue,用于多线程操作数据库,并且提供事务,建议使用这个
    • inDatabase: 参数是一个闭包,在闭包里面可以获得FMDatabase对象
    *  inTransaction: 使用事务.
    
    • FMResultSet: 查询的结果集
      通过字段名称获取字段值

    FMDB使用

    • 建立SQLiteManager.swift 单例对象
    class SQLiteManager: NSObject {
    
      // 单例
      static let sharedManager = SQLiteManager()
    
      let dbQueue: FMDatabaseQueue
    
      override init() {
    
          let documentPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString
    
          let path = documentPath.stringByAppendingPathComponent("fmdb.db")
          print("path: \(path)")
    
          // 创建FMDatabaseQueue对象会自动打开数据库,如果数据库不存在会创建数据库
          // 后续的所有数据库操作都是通过dbQueue来调用
          dbQueue = FMDatabaseQueue(path: path)
    
          super.init()
          // 创建数据表
          createTable()
      }
    
      private func createTable() {
          // 之前的sql语句都是在代码里面在写的,通过文件来加载sql语句,在文件中可以编写多条sql语句
    
          // 获取table.sql文件的路径
          let bundlePath = NSBundle.mainBundle().pathForResource("table", ofType: "sql")!
    
          // 加载table.sql文件里的内容
          let sql = try! String(contentsOfFile: bundlePath)
    //        print("加载文件sql: \(sql)")
    
          dbQueue.inDatabase { (db) -> Void in
              db.executeStatements(sql)
          }
      }
    }
    
    • 测试FMDB

    • 测试FMDB插入单条数据

    /**
    测试FMDB插入单条数据
    */
    func testInsert() {
      // 插入数据sql
      let sql = "INSERT INTO T_Person (name, age, height) VALUES ('赵六6', 26, 1.70);"
    
      SQLiteManager.sharedManager.dbQueue.inDatabase { (db) -> Void in
    
          do {
              try db.executeUpdate(sql, values: [])
              print("插入数据成功")
    
              // 获取插入数据的主键
              let id = db.lastInsertRowId()
              print("插入数据的id: \(id)")
    
          } catch let error as NSError {
              print("error: \(error)")
          }
      }
    }
    
    • 测试FMDB大批量添加数据
    /**
    测试FMDB大批量添加数据
    */
    func testManyInsert() {
      // 插入数据sql
      let sql = "INSERT INTO T_Person (name, age, height) VALUES (?, ?, ?);"
    
      SQLiteManager.sharedManager.dbQueue.inTransaction { (db, rollback) -> Void in
          // 添加10000条数据
          do {
              let start = CFAbsoluteTimeGetCurrent()
              for i in 0..<10000 {
                  try db.executeUpdate(sql, values: ["lisi\(i)", 20, 1.72])
              }
    
              let end = CFAbsoluteTimeGetCurrent()
              print("消耗时间:\(end - start)")
          } catch {
    
          }
      }
    }
    
    • 事务回滚
    /**
    测试FMDB大批量添加数据
    */
    func testManyInsert() {
      // 插入数据sql
      let sql = "INSERT INTO T_Person (name, age, height) VALUES (?, ?, ?);"
    
      SQLiteManager.sharedManager.dbQueue.inTransaction { (db, rollback) -> Void in
          // 添加10000条数据
          do {
              let start = CFAbsoluteTimeGetCurrent()
              for i in 0..<10000 {
                  try db.executeUpdate(sql, values: ["lisi\(i)", 20, 1.72])
    
                  // 模拟数据错误,回滚事务
                  if i == 1000 {
                      // UnsafeMutablePointer<ObjCBool>: 表示 ObjCBool类型的指针
                      // 在OC中: *rollback = YES
                      // 在swift中rollback.memory = true 表示设置ObjCBool的值为true
                      print("数据出错,回滚")
                      rollback.memory = true
                      break
                  }
              }
    
              let end = CFAbsoluteTimeGetCurrent()
              print("消耗时间:\(end - start)")
          } catch {
    
          }
      }
    }
    
    • 测试FMDB修改数据
    /**
    测试FMDB修改数据
    */
    func testUpdate() {
      SQLiteManager.sharedManager.dbQueue.inDatabase { (db) -> Void in
          let sql = "UPDATE T_Person SET name = ? WHERE id = ?;"
    
          do {
              try db.executeUpdate(sql, values: ["liedehua", 1])
              print("更新数据成功")
          } catch let error as NSError {
              print("error: \(error)")
          }
      }
    }
    
    • 测试FMDB查询
    /**
    测试FMDB查询
    */
    func testQuery() {
      SQLiteManager.sharedManager.dbQueue.inDatabase { (db) -> Void in
          do {
              // 查询sql语句
              let sql = "SELECT id, name, age, height FROM T_Person LIMIT ?;"
              let result = try db.executeQuery(sql, values: [20])
    
              while result.next() {
                  // 通过字段名称获取字段值
                  let id = result.intForColumn("id")
    
                  let name = result.stringForColumn("name")
    
                  let age = result.intForColumn("age")
    
                  let height = result.doubleForColumn("height")
    
                  print("id: \(id), name: \(name), age: \(age), height: \(height)")
                  print("------------")
              }
          } catch let error as NSError {
              print("error: \(error)")
          }
      }
    }
    

    相关文章

      网友评论

          本文标题:SQLite数据库框架之FMDB(Swift)

          本文链接:https://www.haomeiwen.com/subject/rzqfrttx.html