Swift4.0-FMDB数据库的使用

  1. 创建数据库
    新建一个FMDBManager管理数据库的单例
class FMDBManager: NSObject {

    // 创建单例
    static let shared = FMDBManager()

    private let databaseFileName = "fmdb111.sqlite"               // 数据库的名称
    private var pathToDatabase: String!                          // 数据库的地址
    private var database: FMDatabase!                           // FMDatabase对象用于访问和操作实际的数据库

    override init() {
        super.init()
        // 获取数据库的地址
        let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
        pathToDatabase = documentDirectory.appending("/\(databaseFileName)")

    }
}

2.打开数据库,有就打开,没有就创建新的

/**创建数据库*/
    func openDatabase() -> Bool{
        var created = false
        //如果数据库文件不存在那么就创建,存在就不创建
        if !FileManager.default.fileExists(atPath: pathToDatabase) {
            database = FMDatabase(path: pathToDatabase)
            if database != nil{
                //数据库是否被打开
                if database.open() {
                    //为数据库创建2张表,PLATFORM_TABLE 和 INVESTMENT_TABLE 是表名,sql语句结束要用;隔开,建表的时候注意类型 (primary key 是用来设置主键的)
                    let sql = "create table \(PLATFORM_TABLE) (uuid integer primary key not null, icon_url text not null, platform_name text not null, ctime integer not null, is_deleted integer not null, is_hot integer not null, is_user_create integer not null , mtime integer not null,  sort integer not null);"
                        +
                    "create table \(INVESTMENT_TABLE) (uuid integer primary key not null, platform_id integer not null, ctime integer not null, is_deleted integer not null, amount integer not null, annual_rate float not null , mtime integer not null,  interest_amount integer not null,  remark text not null, is_call integer not null, interest_start_date text not null, interest_end_date text not null, deposit_period text not null, call_date text not null);"
                    
                    if database.executeStatements(sql) {
                        LMRLog(message: "数据库创建成功")
                        created = true
                    }else{
                        created = false
                        LMRLog(message: "数据库创建失败")
                        print("Failed to insert initial data into the database.")
                        print(database.lastError(), database.lastErrorMessage())
                    }
                }else{
                    LMRLog(message: "数据库打开失败")
                }
            }
        }else{
            //确认database对象是否被初始化,如果为nil,那么判断路径是否存在并创建
            if database == nil{
                if FileManager.default.fileExists(atPath: pathToDatabase){
                    database = FMDatabase(path: pathToDatabase)
                }
            }
            //如果database对象存在,打开数据库,返回真,表示打开成功,否则数据库文件不存在或者发生了其它错误
            if database != nil{
                if database.open(){
                    created = true
                }
            }
        }
        return created
}
  1. 插入数据
/**插入数据(平台)*/
func insertPlatformData(dataArray: [PlatformModel], complete: ((Bool) -> Void)?){
        if openDatabase() {
            if dataArray.count > 0 {
                database.shouldCacheStatements = true
            }
            for model in dataArray{
                let sql = "INSERT INTO \(PLATFORM_TABLE) (uuid,icon_url,platform_name,ctime,is_deleted,is_hot,is_user_create,mtime,sort) VALUES (?,?,?,?,?,?,?,?,?)"
                let res = database.executeUpdate(sql, withArgumentsIn: [model.uuid,model.icon_url,model.platform_name,model.ctime,model.is_deleted,model.is_hot,model.is_user_create,model.mtime,model.sort])
                if !res {
                    //打印插入操作所遭遇的问题
                    LMRLog(message: "平台数据插入失败: \(model.platform_name), \(model.uuid)")
                    LMRLog(message: database.lastError(), file: database.lastErrorMessage())
                }
            }
            complete?(true)
        }
}
  1. 更新数据
/**更新数据(平台*/
func updatePlatformData(dataArray: [PlatformModel], complete: ((Bool) -> Void)?) {
        
        if dataArray.count == 0 {
            return
        }
        if openDatabase() {
            for model in dataArray {
                let query1 = "update \(PLATFORM_TABLE) set icon_url=?, platform_name=?, ctime=?, is_deleted=?, is_hot=?, is_user_create=?, mtime=?, sort=? where uuid=?"
                do {
                    try database.executeUpdate(query1, values: [model.icon_url, model.platform_name, model.ctime, model.is_deleted, model.is_hot, model.is_user_create, model.mtime, model.sort, model.uuid])
                } catch {
                    LMRLog(message: "更新失败")
                    LMRLog(message: error.localizedDescription)
                }
            }
            complete?(true)
        }
 }
  1. 查询数据
/**查找平台数据*/
    func searchPlatformData(platformStarus: PlatformSearch, uuid: Int?, complete: (([PlatformModel]) -> Void)?) {
        if openDatabase() {
            var query: String = ""
            var dataArray: [PlatformModel] = []
            switch platformStarus {
            case .all:
                // 查询全部数据
                query = "select * from \(PLATFORM_TABLE) where is_deleted = 0"
                break
            case .isUserCreate:
                // 用户创建的全部查询出来
                query = "select * from \(PLATFORM_TABLE) where is_user_create = 1 and is_deleted = 0"
                break
            case .unUserCreate:
                // 用户创建的全部查询出来
                query = "select * from \(PLATFORM_TABLE) where is_user_create = 0 and is_deleted = 0"
                break
            case .uuid:
                // 根据UUID查询数据
                if uuid == nil {
                    complete?([])
                    return
                }
                query = "select * from \(PLATFORM_TABLE) where uuid = \(uuid!) and is_deleted = 0"
                break
            }
            
            do{
                //执行SQL语句,该方法需要两个参数,第一个是查寻的语句,第二个是数组,数组中可以包含想查寻的值,并且返回FMResultSet对象,该对象包含了获取的值
                let results = try database.executeQuery(query, values: nil)
                //遍历查寻结果,创建MovieInfo实例对象,并添加到数组中
                while results.next() {
                    let model = PlatformModel()
                    model.ctime = Int(results.longLongInt(forColumn: "ctime"))
                    model.icon_url = results.string(forColumn: "icon_url") ?? ""
                    model.platform_name = results.string(forColumn: "platform_name") ?? ""
                    model.is_deleted = Int(results.int(forColumn: "is_deleted"))
                    model.is_user_create = Int(results.int(forColumn: "is_user_create"))
                    model.mtime = Int(results.longLongInt(forColumn: "mtime"))
                    model.sort = Int(results.int(forColumn: "sort"))
                    model.is_hot = Int(results.int(forColumn: "is_hot"))
                    model.uuid = Int(results.longLongInt(forColumn: "uuid"))
                    model.firstChar = "\(String(describing: model.platform_name.transformToPinYin().characters.first ?? "Z"))".uppercased()
                    dataArray.append(model)
                }
            }catch{
                LMRLog(message: query)
                LMRLog(message: error.localizedDescription)
            }
            complete?(dataArray)
        }
    }
  1. 删除表中的全部数据
    func deleteAllData() {
        
        if openDatabase() {
            
            let query = "DELETE FROM \(PLATFORM_TABLE);DELETE FROM \(INVESTMENT_TABLE);"
            
            if !database.executeStatements(query){
                //打印插入操作所遭遇的问题
                print("Failed to insert initial data into the database.")
                print(database.lastError(), database.lastErrorMessage())
            }
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容