zoukankan      html  css  js  c++  java
  • swift FMDB的使用

    一.导入FMDB,以及libsqlite3.tbd

        这里我是用cocopods导入的

    target 'swifylearn' do
      use_frameworks!
       pod 'FMDB', '~> 2.6.2'
      # Pods for swifylearn
    end

          在项目里面->General-> linked Frameworks and Libraries 添加上libsqlite3.tbd,和FMDB.framework。swift中用pods导入的第三方资源和生成相应的。framework.

    二.下面进入正题:创建数据库,实现增删改查,由于代码是根据我自己的需求,相应的自己做了一下简单的封装

         新建一个SQLiteManager: NSObject文件

         创建单例:

    static let sharInstance:SQLiteManager = SQLiteManager()

         初始化创建数据库:

    func database()->FMDatabase{
            //获取沙盒路径
            var path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
            path = path + "/swiftLearn.sqlite"
            //传入路径,初始化数据库,若该路径没有对应的文件,则会创建此文件
            print("数据库user.sqlite 的路径===" + path)
            return FMDatabase.init(path:path)
        }

           创建表格:

    //MARK: - 创建表格
        
        /// 创建表格
        ///
        /// - Parameters:
        ///   - tableName: 表名称
        ///   - arFields: 表字段
        ///   - arFieldsType: 表属性
        func HQBCreateTable(tableName:String , arFields:NSArray, arFieldsType:NSArray){
            let db = database()
            if db.open() {
                var  sql = "CREATE TABLE IF NOT EXISTS " + tableName + "(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
                let arFieldsKey:[String] = arFields as! [String]
                let arFieldsType:[String] = arFieldsType as! [String]
                for i in 0..<arFieldsType.count {
                    if i != arFieldsType.count - 1 {
                        sql = sql + arFieldsKey[i] + " " + arFieldsType[i] + ", "
                    }else{
                        sql = sql + arFieldsKey[i] + " " + arFieldsType[i] + ")"
                    }
                }
                do{
                   try db.executeUpdate(sql, values: nil)
                    print("数据库操作====" + tableName + "表创建成功!")
                }catch{
                   print(db.lastErrorMessage())
                }
                
            }
            db.close()
            
        }

            添加数据:

    //MARK: - 添加数据
        /// 插入数据
        ///
        /// - Parameters:
        ///   - tableName: 表名字
        ///   - dicFields: key为表字段,value为对应的字段值
        func HQBInsertDataToTable(tableName:String,dicFields:NSDictionary){
            let db = database()
            if db.open() {
                let arFieldsKeys:[String] = dicFields.allKeys as! [String]
                let arFieldsValues:[Any] = dicFields.allValues
                var sqlUpdatefirst = "INSERT INTO '" + tableName + "' ("
                var sqlUpdateLast = " VALUES("
                for i in 0..<arFieldsKeys.count {
                    if i != arFieldsKeys.count-1 {
                        sqlUpdatefirst = sqlUpdatefirst + arFieldsKeys[i] + ","
                        sqlUpdateLast = sqlUpdateLast + "?,"
                    }else{
                        sqlUpdatefirst = sqlUpdatefirst + arFieldsKeys[i] + ")"
                        sqlUpdateLast = sqlUpdateLast + "?)"
                    }
                }
                do{
                   try db.executeUpdate(sqlUpdatefirst + sqlUpdateLast, values: arFieldsValues)

                               print("数据库操作==== 添加数据成功!")

                }catch{
                   print(db.lastErrorMessage())
                }
                
            }
        }
    

            修改数据:

    //MARK: - 修改数据
        /// 修改数据
        ///
        /// - Parameters:
        ///   - tableName: 表名称
        ///   - dicFields: key为表字段,value为要修改的值
        ///   - ConditionsKey: 过滤筛选的字段
        ///   - ConditionsValue: 过滤筛选字段对应的值
        /// - Returns: 操作结果 true为成功,false为失败
        func HQBModifyToData(tableName:String , dicFields:NSDictionary ,ConditionsKey:String ,ConditionsValue :Int)->(Bool){
            var result:Bool = false
            let arFieldsKey : [String] = dicFields.allKeys as! [String]
            var arFieldsValues:[Any] = dicFields.allValues
            arFieldsValues.append(ConditionsValue)
            var sqlUpdate  = "UPDATE " + tableName +  " SET "
            for i in 0..<dicFields.count {
                if i != arFieldsKey.count - 1 {
                    sqlUpdate = sqlUpdate + arFieldsKey[i] + " = ?,"
                }else {
                   sqlUpdate = sqlUpdate + arFieldsKey[i] + " = ?"
                }
                
            }
            sqlUpdate = sqlUpdate + " WHERE " + ConditionsKey + " = ?"
            let db = database()
            if db.open() {
                do{
                   try db.executeUpdate(sqlUpdate, values: arFieldsValues)
                    print("数据库操作==== 修改数据成功!")
                    result = true
                }catch{
                   print(db.lastErrorMessage())
                }
            }
            return result
        }

          查询数据:

    //MARK: - 查询数据
        /// 查询数据
        ///
        /// - Parameters:
        ///   - tableName: 表名称
        ///   - arFieldsKey: 要查询获取的表字段
        /// - Returns: 返回相应数据
        func HQBSelectFromTable(tableName:String,arFieldsKey:NSArray)->([NSMutableDictionary]){
            let db = database()
            let dicFieldsValue :NSMutableDictionary = [:]
            var arFieldsValue = [NSMutableDictionary]()
            let sql = "SELECT * FROM " + tableName
            if db.open() {
                do{
                    let rs = try db.executeQuery(sql, values: nil)
                    while rs.next() {
                        for i in 0..<arFieldsKey.count {
                            dicFieldsValue.setObject(rs.string(forColumn: arFieldsKey[i] as! String), forKey: arFieldsKey[i] as! NSCopying)
                        }
                        arFieldsValue.append(dicFieldsValue)
                    }
                }catch{
                    print(db.lastErrorMessage())
                }
                
            }
             return arFieldsValue
        }

             删除数据:

    //MARK: - 删除数据
        /// 删除数据
        ///
        /// - Parameters:
        ///   - tableName: 表名称
        ///   - FieldKey: 过滤的表字段
        ///   - FieldValue: 过滤表字段对应的值
        func HQBDeleteFromTable(tableName:String,FieldKey:String,FieldValue:Any) {
            let db = database()
            
            if db.open() {
                let  sql = "DELETE FROM '" + tableName + "' WHERE " + FieldKey + " = ?"
                
                do{
                   try db.executeUpdate(sql, values: [FieldValue])
                    print("删除成功")
                }catch{
                   print(db.lastErrorMessage())
                }
            }
    
        }

              删除表格:

     func HQBDropTable(tableName:String) {
            let db = database()
            if db.open() {
                let  sql = "DROP TABLE " + tableName
                do{
                   try db.executeUpdate(sql, values: nil)
                    print("删除表格成功")
                }catch{
                   print(db.lastErrorMessage())
                }
            }
            
        }

             上面是FMDB的基本操作,因为之前有人曾经问过,假如我要改变数据库的结构譬如:在已有的表中添加新字段?我当时的思路是通过创建临时表把旧表的数据导入,接着建新表数据导回去。后面发现这个比较繁琐,其实可以直接加的。

             下面先讲第一种思路:

             

    /// 新增加表字段
        ///   原理:
        ///     修改表名,新建表,将数据从新插入
        /// - Parameters:
        ///   - tableName:表名称
        ///   - newField: 新增表字段
        ///   - dicFieldsAndType: 新表的全部字段 和字段对应的属性
        func HQBChangTable(tableName:String,newField:String, arFields:NSArray, arFieldsType:NSArray){
            let db = database()
            if db.open() {
                if !db.columnExists(newField, inTableWithName: tableName) {
                   //修改表明
                    let  sql = "ALTER TABLE '" + tableName + "' RENAME TO 'old_Table'"
                    do{
                       try db.executeUpdate(sql, values: nil)
                        //创建表
                        HQBCreateTable(tableName: tableName, arFields: arFields, arFieldsType: arFieldsType)
                        //导入数据数据
                        HQBImportData(oldTableName: "old_Table", newTableName: tableName)
                        //删除旧表
                        HQBDropTable(tableName: "old_Table")
                    }catch{
                        print(db.lastErrorMessage())
                    }
                    
                    
                }
                
            }
        }

            创建表,和删除表的方法上面用,下面是导入数据的方法:

    /// 导入数据
        ///
        /// - Parameters:
        ///   - oldTableName: 临时表名
        ///   - newTableName: 原表明(增加字段的表明)
        func  HQBImportData(oldTableName:String,newTableName:String)  {
            let  db = database()
            if db.open() {
                let sql = "INSERT INTO " + newTableName + " SELECT  id,usedName, date, age, phone, ''  FROM " + oldTableName
                do{
                   try db.executeUpdate(sql, values: nil)
                }catch{
                   print(db.lastErrorMessage())
                }
            }
            
        }

            接下来就是我说的直接增加字段就可以了:

     /// 新增加表字段
        ///
        /// - Parameter tableName: 表名
        func HQBChangeTableWay1(tableName:String , addField:String,addFieldType:String)  {
            let db = database()
            if db.open() {
               let sql  = "ALTER TABLE " + tableName + " ADD " + addField + addFieldType
               do{
                  try db.executeUpdate(sql, values: nil)
               }catch{
                  print(db.lastErrorMessage())
               }
            }
        }

             OK,记录完毕。

  • 相关阅读:
    pgpoolII3.1 的内存泄漏(二)
    iOS 开发的一些网址
    ios开发必备第三方库
    iOS截屏方法
    ios开发第三方库cocoapods安装
    iOS开发知识点总结
    iOS开发文件夹Copy items if needed
    iOS开源库最全的整理
    iOS图标抖动效果
    iOS 加密的3种方法
  • 原文地址:https://www.cnblogs.com/HQBBOX/p/6587058.html
Copyright © 2011-2022 走看看