簡單的封裝了一下FMDB:FMDBOperator
簡單的封裝了一下FMDB,支持鏈式操作,繼承,更加面向對象的操作!支持緩存時間設置!
其實寫的比較簡陋,還需要合理的完善!目前,應用是足夠了!
特征:
1.字段驗證。保證 插入數據中的字典 的 key 跟數據庫的字段相匹配
// MARK: - 保證 插入的數據中的 字典 的 key 能跟數據庫的字段相匹配 func checkField(name: String) -> Bool{ let fields = getFields() var fieldNames = [String]() for f:[String: AnyObject] in fields { let str = f.first!.0 // 保存所有字段的名字 fieldNames.append(str) } return fieldNames.contains(name) }
2.swift的反射。自動拼接sql中的字段以及對應的值
...... let v = p.value let propertyMirrorType: Mirror = Mirror(reflecting:v) print(propertyMirrorType.subjectType) let typeName = "\(propertyMirrorType.subjectType)".trimOptional() let vend = "\(v)".trimOptional() if typeName == "String" { value += "\(vend)," } else if typeName == "Int" { value += "\(vend)," } .......
3.鏈式操作。增(add)刪(remove)改(save)查(find)支持鏈式操作。
student.condition("name='野原新之助'").save(["birthDay": "7.22"])
4.緩存設置。支持緩存時間設置。內置了一張緩存表。記錄其他表的緩存時間。方便數據的重復使用。減少網絡更新。
內置了一張Cache表。字段last_time記錄上一次的緩存時間。
func createCacheTable() { let sql = "CREATE TABLE IF NOT EXISTS Cache (cache_id integer primary key AutoIncrement,table_name varchar(20),last_time REAL)" db.executeUpdate(sql, withArgumentsInArray: nil) }
設置表格的cacheTime。
我們通過類設置一次就在Cache中有了一條記錄。以后每次使用這個類不會重復的插入了。
var cacheTime: Double = 0.0 { didSet { if cacheTime > 0.0 { let cTime = getCacheTime() if let _ = cTime { return } // 計算 let timeStamp = NSDate().timeIntervalSince1970 + cacheTime let sql = "INSERT INTO Cache (table_name, last_time) VALUES ('\(tableName!)',\(timeStamp))" db.executeUpdate(sql, withArgumentsInArray: nil) } } }
判斷緩存是否過期并更新緩存時間。
var isExpired:Bool { // 查詢出 緩存的時間 let cTime = getCacheTime() if let c = cTime { // 當前時間 // 加上 緩存秒數 // 對比當前時間,返回 是否過期 let currentTime = NSDate().timeIntervalSince1970 // 如果 過期 更新緩存表信息 if currentTime > c { self.table("Cache").condition("table_name='\(tableName!)'").save(["last_time": currentTime + cacheTime]) } return currentTime > c } return true }
例子:你有幾條信息。設置的cacheTime是90s。那么,過期之后把表中的數據可以通過remove()干掉。然后從網絡從新更新。然后再更新緩存時間。下一次就用緩存中的數據了。
// 然后開始遍歷 let banner = Banner() // 過期后 刪除緩存 重新緩存 if (banner.isExpired) { print("過期了請更新") banner.remove() print("banner 取自于 網絡") for dict in arr { let banner = Banner(dict: dict) bannerList.append(banner) banner.insert() } } else { print("banner 取自于 緩存") let arr = banner.find() as! [[String: AnyObject]] for dict in arr { let banner = Banner(dict: dict) bannerList.append(banner) } }
示例:
聲明一個Student類繼承FMDBOperator
class Student: FMDBOperator { var name: String? var age: Int = 0 var birthDay: String? // MARK: - 構造函數 override init() { super.init() tableName = "Student" } override func returnCreateTableSentence() -> String { return "CREATE TABLE IF NOT EXISTS Student (sid integer primary key AutoIncrement,name varchar(20),age varchar(20), birthDay varchar(20))" } }
增(add)
student.name = "野原新之助" student.age = 5 student.birthDay = "7月22日" student.insert()
或者你還可以
student.insert(["name": "阿呆", "age": 6, "birthDay": "11月30"])
或者插入多條
let arr = [ ["name": "風間", "age": 6, "birthDay": "10月33"], ["name": "妮妮", "age": 5, "birthDay": "01月21"] ] student.insertAll(arr)
刪(remove)
根據ID刪除(這個似乎有些雞肋,不過我會增加條件刪除的)
student.remove(id的值)
刪除全部
student.remove()
改(save)
student.condition("name='野原新之助'").save(["birthDay": "7.22"])
查(find)
查詢單條數據
student.find(id的值) as! [String: AnyObject]
條件查詢
student.condition("age=2").find()
查詢所有數據
student.find() as! [[String: AnyObject]]
其他操作方式
比如:我聲明了一個其他的類。只要它繼承自FMDBOperator。就會操作任意的表。
// 查詢 表 Student 中所有 age 為 2的小朋友 self.table('Student').condition("age=2").find() // 更新 表 Student 中叫 野原新之助 的信息 self.table('Student').condition("name='野原新之助'").save(["birthDay": "7.22"])
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!