简单的封装了一下FMDB:FMDBOperator
jopen
9年前
简单的封装了一下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"])