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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM