swift FMDB的使用

一.導入FMDB,以及libsqlite3.tbdsql

    這裏我是用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.swift

二.下面進入正題:建立數據庫,實現增刪改查,因爲代碼是根據我本身的需求,相應的本身作了一下簡單的封裝app

     新建一個SQLiteManager: NSObject文件spa

     建立單例:code

static let sharInstance:SQLiteManager = SQLiteManager()

     初始化建立數據庫:sqlite

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)
    }

       建立表格:blog

//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("數據庫操做==== 添加數據成功!")get

            }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,記錄完畢。

相關文章
相關標籤/搜索