簡單的封裝了一下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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!