簡單的封裝了一下FMDB:FMDBOperator

jopen 8年前發布 | 10K 次閱讀 iOS開發 移動開發 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"])

項目主頁:http://www.baiduhome.net/lib/view/home/1449998248143

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