一.導入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,記錄完畢。