博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库:SwiftSQlite
阅读量:6378 次
发布时间:2019-06-23

本文共 7453 字,大约阅读时间需要 24 分钟。

与sqlite比较

本质:sqlite。SwiftSqlite是swift的封装。类似FMDB是OC的封装。

易于使用原因:sql语句转化为对应关于对象操作。其实对应的是相应的sql语句。

使用

初始化

  1. 数据库,表,表结构,初始化
public static let standard = PTDownloadTable()        //数据库    private var db: Connection?    //表    private let downLoadFile = Table("downLoadFile")    // 列(数据库表结构)    private let id = Expression
("id") private let fielUrl = Expression
("fielUrl") private let downLoadState = Expression
("downLoadState") private let isBrowse = Expression
("isBrowse") private let destinationFielUrl = Expression
("destinationFielUrl") private let downLoadTime = Expression
("downLoadTime") private let type = Expression
("type") private let title = Expression
("title") private let brief = Expression
("biref") init () { // self.db = createDB() createTable() }复制代码
  1. 创建数据库并连接
/// 创建数据库,并连接    private func createDB() -> Connection? {        //获取doc路径        let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!        //如果不存在的话,创建一个名为db.sqlite3的数据库,并且连接数据库        do {            let db = try Connection("\(path)/db.sqlite3")            print("✅数据库创建并连接成功:\(db)")            return db        } catch {            print("?数据库创建并连接失败:\(error)")            return nil        }    }复制代码
  1. 创建表
/// 创建下载表,已经存在不会再次创建    private func createTable() {        if let db = self.db {            do {                try db.run(downLoadFile.create(block: { (t) in                        t.column(id, primaryKey: .autoincrement)                        t.column(fielUrl, defaultValue: "")                        t.column(downLoadState, defaultValue: "0")                        t.column(isBrowse, defaultValue: false)                        t.column(destinationFielUrl, defaultValue: "")                        t.column(downLoadTime, defaultValue: "")                        t.column(type, defaultValue: "")                        t.column(title, defaultValue: "")                        t.column(brief, defaultValue: "")                    }))                print("✅下载列表创建成功")            } catch {                print("?下载列表创建失败:\(error)")            }        }    }复制代码

注意: 第一次创建成功,之后不会再次创建。


/// 增加记录    public func insertOne(_ fileModel: PTDownLoadModel) {        if let db = self.db {            let insertDownLoadModel = downLoadFile.insert(fielUrl <- fileModel.fielUrl,                                                    downLoadState <- fileModel.downLoadState,                                                    isBrowse <- fileModel.isBrowse,                                                    destinationFielUrl <- fileModel.destinationFielUrl,                                                    downLoadTime <- fileModel.downLoadTime)            do {               try db.run(insertDownLoadModel)                print("✅增加成功")            } catch {                print("?增加失败:\(error)")            }        }         }复制代码

/// 查询多条记录    public func queryManyRecord() -> [PTDownLoadModel]? {                var array: [PTDownLoadModel] = []        if let db = self.db {            do {                for fileModel in try db.prepare(downLoadFile) {                    let downLoadModel = PTDownLoadModel()                    downLoadModel.fielUrl = fileModel[fielUrl]                    downLoadModel.downLoadState = fileModel[downLoadState]                    downLoadModel.isBrowse = fileModel[isBrowse]                    downLoadModel.destinationFielUrl = fileModel[destinationFielUrl]                    downLoadModel.downLoadTime = fileModel[downLoadTime]                    downLoadModel.type = fileModel[type]                    downLoadModel.title = fileModel[title]                    downLoadModel.brief = fileModel[brief]                    array.append(downLoadModel)                }                print("✅查询多条数据成功")                return array            } catch {                print("?查询多条数据失败:\(error)")                return nil            }        }        return nil            }复制代码
/// 查询单条记录    public func queryOneRecord(_ url: String) -> Bool {                if let db = self.db {            do {                for fileModel in try db.prepare(downLoadFile) {                    if url == fileModel[fielUrl] {                        print("✅查询单条数据成功:\(url)")                        return true                    }                }                print("?查询单条数据失败")                return false            } catch {                print("?查询单条数据失败:\(error)")                return false            }        }        return false            }复制代码

///更新单条条记录:下载状态和下载地址    public func updateOneLoadRecord(_ url: String,_ state: String,_ destinationUrl: String,_ loadTime: String,_ typeStr: String,_  titleStr: String,_  briefStr: String) {                if  let db = self.db {            let fileModel = downLoadFile.filter(fielUrl == url)            do {                if destinationUrl == "" {                    try db.run(fileModel.update(downLoadState <- state))                } else if loadTime == "" {                    try db.run(fileModel.update(downLoadState <- state))                } else {                    //只有真正下载完成,才更新:下载地址和下载时间                   try db.run(fileModel.update(downLoadState <- state,                                               destinationFielUrl <- destinationUrl,                                               downLoadTime <- loadTime,                                               type <- typeStr,                                               title <- titleStr,                                               brief <- briefStr))                }                                print("✅更新单条条记录(下载状态和下载地址)数据成功")            } catch {                print("?更新单条条记录(下载状态和下载地址):数据失败:\(error)")            }        }    }复制代码

/// 删除对应数据    func delete(_ url: String) {                if let db = self.db {            let fileModel = downLoadFile.filter(fielUrl == url)            do {                try db.run(fileModel.delete())                print("✅删除成功:\(url)")            } catch {                print("?删除失败:\(url):\(error)")            }        }    }复制代码

表字段更新

/// 更新表    private func updateTableColumn() {        if let db = self.db {            do {                try db.run(downLoadFile.addColumn(userId, defaultValue: ""))                print("✅下载列表更新成功")            } catch {                print("?下载列表更新失败:\(error)")            }        }    }复制代码

一般表字段更新会伴随兼容之前版本问题。就需要考虑数据迁移。


数据迁移

/// 数据迁移(一开始没有userId列数据,更新值)    public func dataMigration(_ userIdStr: String) {        if let db = self.db {            let fileModel = downLoadFile.filter(userId == "")            do {                try db.run(fileModel.update(userId <- userIdStr))                UserDefaults.standard.setValue(true, forKey: "isMigration")                print("✅数据迁移成功")            } catch {                UserDefaults.standard.setValue(false, forKey: "isMigration")                print("?数据迁移失败:\(error)")            }        }    }复制代码

需要把新增列userId的数据过滤出来,然后统一更新。迁移只需一次,所有用了userdefault记录。

/// 是否迁移成功    public func isMigrationSuccess() -> Bool {        if let isMigration = UserDefaults.standard.value(forKey: "isMigration") as? Bool {            return isMigration        } else {            return false        }    }复制代码

判断迁移成功,就不必在迁移。


测试

  • 使用模拟器测试,可以在电脑端看到具体路径。把db的路径打印出来就可以。
  • 测试工具:【Navicat for SQLite】,打开文件即可。
  • 数据更新可以刷新工具,数据同步。

多表查询

转载地址:http://hzxqa.baihongyu.com/

你可能感兴趣的文章
Countly 19.02.1 发布,实时移动和 web 分析报告平台
查看>>
TCP连接中time_wait在开发中的影响-搜人以鱼不如授之以渔
查看>>
Oracle数据库机出新帮助不同规模企业迈向云端
查看>>
前端通信:ajax设计方案(六)--- 全局配置、请求格式拓展和优化、请求二进制类型、浏览器错误搜集以及npm打包发布...
查看>>
Android捕获监听Home键、最近任务列表键
查看>>
微服务分布式企业框架 Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa
查看>>
word2vec原理(三) 基于Negative Sampling的模型
查看>>
被《时代周刊》选为年度最佳发明,PS VR靠的竟然是价格
查看>>
通用唯一标识码UUID的介绍及使用。
查看>>
spring笔记--依赖注入之针对不同类型变量的几种注入方式
查看>>
Java爬虫——网易云热评爬取
查看>>
Ajax的简单学习
查看>>
无华为,不智慧:智慧城市建设为何少不了华为?
查看>>
高性能网络通信框架Netty-基础概念篇
查看>>
为npm配置taobao源
查看>>
orm框架(SQLAlchemy) 连接数据库和创建表
查看>>
OSPF多区域虚电路配置
查看>>
zookeeper初探三 java客户端连接
查看>>
管理邮件用户
查看>>
Python中的运算符、数据类型、字符串及列表操作举例
查看>>