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,记录完毕。

  • 相关阅读:
    Unity 3(一):简介与示例
    MongoDB以Windows Service运行
    动态SQL中变量赋值
    网站发布IIS后堆栈追踪无法获取出错的行号
    GridView Postback后出错Operation is not valid due to the current state of the object.
    Visual Studio 2010 SP1 在线安装后,找到缓存在本地的临时文件以便下次离线安装
    SQL Server 问题之 排序规则(collation)冲突
    IIS 问题集锦
    linux下安装mysql(ubuntu0.16.04.1)
    apt-get update 系列作用
  • 原文地址:https://www.cnblogs.com/HQBBOX/p/6587058.html
Copyright © 2011-2022 走看看