基於Swift使用FMDB實現(增刪改查+搜索+聊天置頂+分頁讀取)

Pod引入FMDB框架(記得加use_frameworks!),引入頭文件import FMDB

寫一個DBManager類

class DBManager: NSObject {

    static let shareManager = DBManager()
    var dbQueue: FMDatabaseQueue?
    func openDB() {
        let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
        let userPath = documentDirectory?.stringByAppendingPathComponent(path: "data10001")
        if !FileManager.default.fileExists(atPath: userPath!) {
            guard ((try? FileManager.default.createDirectory(atPath: userPath!, withIntermediateDirectories: false, attributes: nil)) != nil) else {
                return
            }
        }
        let fileName = userPath?.stringByAppendingPathComponent(path: "person.db")
        dbQueue = FMDatabaseQueue(path: fileName)
    }
}

extension String {
    //給String擴展一個stringByAppendingPathComponent方法 
    func stringByAppendingPathComponent(path: String) -> String {
        let nsString = self as NSString
        return nsString.appendingPathComponent(path)
    }
}

每一張表寫一個DAO(Data Access Object),寫sql語句操作數據庫,暴露接口,例如TABLE_LIST表的ListDAO的部分代碼

/// 單例
static let shareDAO = ListDAO()

/// 創建表
func creatTable() {
    let sqlString = "CREATE TABLE IF NOT EXISTS TABLE_LIST('personId' Integer Integer PRIMARY KEY NOT NULL, 'name' Text, 'isTop' Integer)"  //字段的單引號可有可沒有,添加主鍵防止重複添加
    DBManager.shareManager.dbQueue?.inDatabase({ (db) in
        guard (db?.executeUpdate(sqlString, withArgumentsIn: [])) != nil else {
            return
        }
    })
}

/// 刪除表
func dropTable() {
    let sqlString = "DROP TABLE TABLE_LIST"
    DBManager.shareManager.dbQueue?.inDatabase({ (db) in
        guard (db?.executeUpdate(sqlString, withArgumentsIn: [])) != nil else {
            return
        }
    })
}

/// 插入數據
func insertData(model: ListModel) {
    let sqlString = "INSERT OR REPLACE INTO TABLE_LIST(personId, name, isTop) values (?,?,?)"
    DBManager.shareManager.dbQueue?.inDatabase({ (db) in
        guard (db?.executeUpdate(sqlString, withArgumentsIn: [model.personId, model.name, model.isTop]))! else {
            return
        }
    })
}

/// 獲取數據(已經置頂)
func getDataList() -> Array<ListModel> {
    var resultArray = Array<Any>()
    DBManager.shareManager.dbQueue?.inDatabase({ (db) in
        //無條件全量查找
        //let sqlString = "SELECT * FROM TABLE_LIST";
        //根據isTop字段降序輸出
        let sqlString = "SELECT * FROM TABLE_LIST ORDER BY isTop DESC";
        guard let set = try? db?.executeQuery(sqlString, values: []) else {
            return
        }
        while (set?.next())! {
            let model = ListModel()
            model.personId = Int((set?.int(forColumn: "personId"))!)
            model.name = set?.string(forColumn: "name")
            model.isTop = (set?.bool(forColumn: "isTop"))!
            resultArray.append(model)
        }
        set?.close()
    })
    return resultArray as! Array<ListModel>
}

/// 刪除單條數據
func deleteDataOfDataList(personId: Int) -> Bool {
    var result: Bool = false
    DBManager.shareManager.dbQueue?.inDatabase({ (db) in
        let sqlString = "DELETE FROM TABLE_LIST WHERE personId = ?"
        result = (db?.executeUpdate(sqlString, withArgumentsIn: [personId]))!
    })
    return result
}

/// 置頂操作
func setTopWithPersonId(personId: Int, isTop: Bool) -> Bool {
    var result: Bool = false
    DBManager.shareManager.dbQueue?.inDatabase({ (db) in
        let sqlString = "UPDATE TABLE_LIST SET isTop = ? WHERE personId = ?"
        result = (db?.executeUpdate(sqlString, withArgumentsIn: [isTop,personId]))!
    })
    return result
}

TABLE_DETAIL表的DetailDAO的部分代碼

/// 查詢數據(全量獲取)
func getDataListWithString(string: String) -> Array<Any> {
    var resultArray = Array<Any>()
    DBManager.shareManager.dbQueue?.inDatabase({ (db) in
        // LIKE '%Java%'查詢des字段中包含Java的, LIKE 'Java*' 查詢以Java開頭的, '*Java查詢以Java結尾的'
        // 查詢 TABLE_DETAIL 表中包含string的model
        let sqlString = "SELECT * FROM TABLE_DETAIL WHERE des LIKE '%" + string + "%'"
        guard let set = try? db?.executeQuery(sqlString, values: []) else {
            return
        }
        while (set?.next())! {
            let model = DetailModel()
            model.desId = Int((set?.int(forColumn: "desId"))!)
            model.des = set?.string(forColumn: "des")
            resultArray.append(model)
        }
        set?.close()
    })
    return resultArray
}

/// 分頁獲取數據(分頁讀取,每次20條)
func pageReadDataListWith(page: Int) -> Array<Any> {
    var resultArray = Array<Any>()
    DBManager.shareManager.dbQueue?.inDatabase({ (db) in
        var sqlString = String()
        if page != 1 {
            // TABLE_DETAIL AS TD: 爲TABLE_DETAIL起個別名TD
            // TD.desId>\(page * 20): 查詢TD.desId大於當前的數據
            // ORDER BY TD.desId ASC: 根據TD.desId升序
            // LIMIT 0,20: 每次獲取20條數據
            sqlString = "SELECT * FROM TABLE_DETAIL AS TD WHERE TD.desId>\(page * 20) ORDER BY TD.desId ASC LIMIT 0,20"
        } else {
            // ASC 升序(默認)  DESC 降序
            sqlString = "SELECT * FROM TABLE_DETAIL AS TD ORDER BY TD.desId ASC LIMIT 1,20"
        }
        guard let set = try? db?.executeQuery(sqlString, values: []) else {
            return
        }
        while (set?.next())! {
            let model = DetailModel()
            model.desId = Int((set?.int(forColumn: "desId"))!)
            model.des = set?.string(forColumn: "des")
            resultArray.append(model)
        }
        set?.close()
    })
    return resultArray
}

DEMO效果

這裏寫圖片描述

DEMO地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章