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