Swift开发对FMDB的二次封装

   

iOS开发对于本地持久化数据提供了多种解决途径(归档,写入文件,写入plist,存入本地数据库等等),今天我们就来看看sqlite的封装和使用。有的小伙伴用coreData来操作sqlite,有的直接使用sql语句来操作sqlite,但大部分开发者都是FMDB的忠实粉丝。FMDB优秀的封装逻辑是开发者钟情的原因所在,但是在优秀的第三方都会出现被弃用的可能性,一旦此种情况发生而我们代码到处充斥着此第三方的代码,那么代码的维护将是毁灭性的,而将此第三方封装成一个独立的工具类可完美的解决此问题!

上代码!!!

import FMDB
class DB: NSObject {
    //单例
    static let shareServeTool = DB()

    //定义管理数据库的对象
    var db:FMDatabase!

    //线程锁,通过加锁和解锁来保证所做操作数据的安全性
    let lock = NSLock()

    /**
     *1.重写父类的构造方法
     */

    override init() {
        super.init()
        //设置数据库的路径;fmdb.sqlite是由自己随意命名
        let path = NSTemporaryDirectory().appending("library.db")
        print(path)

        //构造管理数据库的对象
        db = FMDatabase(path: path)

        //判断数据库是否打开成功;如果打开失败则需要创建数据库
        if !db.open() {
            print("数据库打开失败")
            return
        }else{
            self.create()
        }
    }

    /*****************************1.创建表********************************/
    func create()  {
        //创建数据库
        //student表达表名,由自己命名
        //uid,data是需要收藏的模型中的字段,须根模型中保持一致
        //varchar表示字符串,integer表示数字,blob表示二进制数据NSData
        let createSql = "CREATE TABLE IF NOT EXISTS userCache(keys varchar(300),valu varchar(300))"

        //执行sel语句进行数据库的创建
        do {
            try db.executeUpdate(createSql, values: nil)
        }catch {
            print(db.lastErrorMessage())
        }
    }

    /*****************************2.增********************************/

    func insertDataWith(valu:String,keys:String) {

        //加锁操作
        lock.lock()

        //sel语句
        //(?,?)表示需要传的值,对应前面出现几个字段,后面就有几个问号
        let insetSql = "insert into user(keys , valu) values(?,?)"

        //更新数据库
        do {
            try db.executeUpdate(insetSql, values: [keys,valu])
        }catch {
            print(db.lastErrorMessage())
        }

        //解锁
        lock.unlock()

    }

    /*****************************3.删********************************/

    func deleteDataWith(keys:String) {
        //加锁操作
        lock.lock()
        //sel语句
        //where表示需要删除的对象的索引,是对应的条件
        let deleteSql = "delete from user where keys = ?"
        //更新数据库
        do{
            try db.executeUpdate(deleteSql, values: [keys])
        }catch {
            print(db.lastErrorMessage())
        }
        //解锁
        lock.unlock()
    }

    /*****************************4.改********************************/

    func updateDataWith(valu:String,keys:String) {
        //加锁
        lock.lock()
        //where id = ?中的id可传可不传
        let updateSql = "update user set values = ? where keys = ?"
        //更新数据库
        do{
            try db.executeUpdate(updateSql, values: [valu])
        }catch {
            print(db.lastErrorMessage())
        }
        //解锁
        lock.unlock()
    }

    /********5.判断数据库中是否有当前数据(查找一条数据)*********************/

    func isHasDataInTable(keys:String) -> Bool {
        let isHas = "select * from user where keys = ?"
        do{
            let set = try db.executeQuery(isHas, values: [keys])
            //查找当前行,如果数据存在,则接着查找下一行
            if set.next() {
                return true
            }else {
                return false
            }
        }catch {}
        return true
    }

    /********6.根据条件查找数据*********************/
    func fetchAllData(keys:String) ->([String]){
        let fetchSql = "select * from user where keys = ?"
        //用于符合条件数据的临时数组
        var tempArray = [String]()
        do {
            let set = try db.executeQuery(fetchSql, values: [keys])
            //循环遍历结果
            while set.next() {
                var valu = String()
                //给字段赋值
                valu = set.string(forColumn: "valu")!
                tempArray.append(valu)
            }

        }catch {
            print(db.lastErrorMessage())
        }
        return (tempArray)
    }

    func fetchAllData() ->([String],[String] ){
        let fetchSql = "select * from user"
        //用于承接所有数据的临时数组
        var tempArray = [String]()
        var tempArrays = [String]()
        do {
            let set = try db.executeQuery(fetchSql, values: nil)
            //循环遍历结果
            while set.next() {
                var values = String()
                var keys = String()
                //给字段赋值
                values = set.string(forColumn: "data")!
                keys = set.string(forColumn: "keys")!
                tempArray.append(values)
                tempArrays.append(keys)
            }
        }catch {
            print(db.lastErrorMessage())
        }
        return (tempArray,tempArrays)
    }
}

你可能感兴趣的:(技术)