SQLite.swift 使用

原理介绍就不说赘述了,直接集成。

  1. cocoapods配置sdk
pod 'SQLite.swift'
  1. model模型直接用字段名得先封装以下,这里我们转换(宏定义)一下,方便引用
//1.声明model模型
class CDOptionModel: NSObject {
    enum CDOptionType:String {
        case yes = "YES"
        case no = "NO"
    }
    var title:String = "" //字符串
    var isLike = false  //布尔
    var createTime:Int = 0  //Int值
    var type:CDOptionType = .no   //枚举
}

2.转化(宏定义),在后续操作中可用以下别名
let sqlFileName = "MySQL.db"   //数据库名称
let OptionModel = Table("TabName") //表名称,可同model名
let db_id = Expression<Int>("id") //数据库自增id
let db_title = Expression<String>("title")
let db_createTime = Expression<Int>("createTime") //创建时间
let db_type = Expression<Int>("type") //分类
  1. 创建数据库,创建表
class CDSqlManager: NSObject {
    static let shared = CDSqlManager()
    var db:Connection!
    private override init() {
        super.init()
        objc_sync_enter(self)
        openDatabase()
        objc_sync_exit(self)
    }
//创建数据库文件
    private func openDatabase() {
        let libraryPath = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true).first!
        let dbpath = libraryPath().appendingPathComponent(str: "/\(sqlFileName)")
        if !FileManager.default.fileExists(atPath: dbpath) {
            FileManager.default.createFile(atPath: dbpath, contents: nil, attributes: nil)
            db = try! Connection(dbpath)
            createTable()
        }else{
            do{
                db = try Connection(dbpath)
                CDPrint(item: "数据库连接成功")
            }catch{
                CDPrint(item: "数据库连接失败:\(error.localizedDescription)")
            }
        }
    }
//建议:每个表加一个扩展,在该扩展下写该表的所有操作,本文件只用来建、连数据库,数据库更新等
    private func createTable() -> Void {
        CDPrintManager.log("创建数据库表", type: .InfoLog)
        createOptionTable()
    }
}

    func CDPrint(item:Any) {
        print(item)
    }

4.数据的增删改查 因为数据模型比较多时,全部写在同一个文件不好阅读和维护,建议一个表写入一个扩展文件中 CDSqlManager+option.swift

extension CDSqlManager{
    
    //创建表
    internal func createOptionTable() -> Void {
        do{
            let create = OptionModel.create(temporary: false, ifNotExists: false, withoutRowid: false) { (build) in
                build.column(db_id,primaryKey: true)
                build.column(db_title)
                build.column(db_createTime)
                build.column(db_isLike)
                build.column(db_type)
            }
            try db.run(create)
            CDPrint(item:"createOptionModel -->success")

        }catch{
            CDPrint(item:"createOptionModel -->error:\(error)")
        }
    }
    
//所有query,数据库模型转OptionModel
    private func getNKOptionModelFromItem(item:Row) -> NKOptionModel {
        let info = NKOptionModel()
        info.title = item[db_title]
        info.createTime = item[db_createTime]
        info.type = NKOptionType(rawValue: item[db_type])!
        info.isLike = item[db_isLike]
        return info
    }
    
//查询字段的属性,直接在字段后跟上该属性,.max(),.min() 
    private func queryMaxInt()->Int{
        //查询表内最大id,新记录的id = 最大id+1
        var maxInt = 0
        do{
            maxInt = try db.scalar(OptionModel.select(db_createTime.max)) ?? 0
            CDPrint(item:"queryAllModelList -->success")
        }catch{
            CDPrintManager.log("queryAllModelList -->error:\(error)", type: .ErrorLog)
        }
        return maxFileId
    }
    //添加数据
    func addNKOptionModel(info:NKOptionModel) {
        let ModelId = queryMaxModelId() + 1
        do {
            try db.run(OptionModel.insert(
                //用户模型向数据库模型赋值,用<-
                db_title <- info.title,
                db_createTime <- info.createTime,
                db_type <- info.type.rawValue,
                db_isLike <- info.isLike)
            )
        } catch  {
            CDPrint(item: "addNKOptionModel error:\(error)")
        }
    }
    
//删除模型 filter表条件,多个条件可用&& || ,类似OC sql 语句中的where xxx and xxx, where xxx or xxx
    func deleteOneModel(info:NKOptionModel){
        do {
            try db.run(OptionModel.filter(db_title == info.title).delete())
        } catch  {
            CDPrint(item:"deleteOneModel -->error:\(error)")
        }
    }
    //删除tab内所有数据
    func deleteAllModel(){
        do {
            try db.run(OptionModel.delete())
        } catch  {
            CDPrint(item:"deleteOneModel -->error:\(error)")
        }
    }
    
//改
    func updateModelTitle(type:CDOptionType,title:String,changeTime:Int){
        do {
            let sql = OptionModel.filter(db_title == title && db_type == type.rawValue) //多个条件可用&& = and, || = or
            try db.run(sql.update(db_changeTime <- changeTime))
        } catch  {
            CDPrint(item:"updateModelTitle -->error:\(error)")
        }
    }
    
//查询tab内所有数据
    func queryAllModelList() -> [NKOptionModel]{
        var arr:[NKOptionModel] = []
        do {
            //desc 降序,aes 升序
            let sql = OptionModel.order(db_createTime.desc)
            for item in try db.prepare(sql) {
                let info = getNKOptionModelFromItem(item: item)
                arr.append(info)
            }
        } catch  {
            CDPrint(item:"queryAllModelList -->error:\(error)")
        }
        return arr
    }
}
//查询单个字段
func queryCreateTime(title:String) -> Int{
        var index = 0
        do {
            let sql = OptionModel.filter(db_title == title)
            for item in try db.prepare(sql.select(db_createTime)) {
                index = item[db_createTime]
            }
        } catch  {
            CDPrint(item:"queryCreateTime -->error:\(error)")
        }
        return index

注意:

        //条件关键字:filter
        //修改更新关键字:db.update(sql)
        //查询db.prepare(sql)
        //执行sql语句: db.run(sql)
        //删除的sql: dbModel.filter(条件).delete() 
        //删除整个表记录的sql: dbModel.delete() 
        //符合条件数量的sql dbModel.filter(条件).count
        //表内所有数量的sql dbModel.count
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容