FMDB是一个对SQLite封装的第三方框架

里面有三个核心对象FMDatabaseQueue,FMDatabase,FMResultSet

FMDatabase是数据库的操作对象

FMDatabaseQueue在多线程下查询和更新数据库会用到,以串行队列的方式去调度数据库的操作

为什么要以串行队列的方式,因为就好比你多个线程去操作一个数据库,如果都要进行写入操作,这样可能就会出现混乱,而且也可能会写入失败

很难进行处理。所以就创建一个串行队列一个一个的去进行调度任务。所以我们一定不要在多个线程去同时的操作数据库。

FMResultSet 是结果集合,就是为了查询数据,会用到。

FMDB中的特殊语法 :key 是和字典中的 key 是相对应的,调用下面的函数

insert(dict: ["name":"李四" as AnyObject,"age":18 as AnyObject,"height":1.9 as AnyObject])



func insert(dict:[String:AnyObject])
    {
        let sql = "INSERT INTO T_Person (name,age,height) VALUES (:name,:age,:height);"
        
        SQLiteManager.sharedManager.queue.inDatabase { (db) in
            
            if db.executeUpdate(sql, withParameterDictionary: dict)
            {
                print("插入成功")
            }
            else
            {
                print("插入失败")
            }
        }



更新数据库中的数据

update(dict: ["id":6 as AnyObject,"name":"李四" as AnyObject,"age":18 as AnyObject,"height":1.8 as AnyObject])
func update(dict:[String:AnyObject])
    {
         let sql = "UPDATE T_Person set name = :name, age = :age,height = :height \n" + "WHERE id = :id;"
        
        SQLiteManager.sharedManager.queue.inDatabase { (db) in
            
            if db.executeUpdate(sql, withParameterDictionary: dict)
            {
                print("更新成功 \(db.changes)")
            }
            else
            {
                print("更新失败")
            }
        }
        
    }

删除数据库中的数据

//删除数据
    func delete(id:Int)
    {
        //准备SQL语句
        let sql = "DELETE FROM T_Person WHERE id = :id"
        //执行SQL语句
        SQLiteManager.sharedManager.queue.inDatabase { (db) in
            
            if db.executeUpdate(sql, withArgumentsIn:[id])
            {
                print("更新成功 \(db.changes)")
            }
            else
            {
                print("更新失败")
            }
        }
        
    }



在FMDB中我们需要使用相应的返回值类型来取相应的数值,比如说,id是表中一列的一个属性,我们可以这么做 let id = res.int(forColumn: "id")

res.columnName(for: i) 获取相应列的名字

res.object(forColumnIndex: i) 获取相应列的值

我们通过看这个框架的源代码知道,它是创建了一个串行队列的,最后一个参数NULL,就代表是DISPATCH_QUEUE_SERIAL

iOS开发中FMDB的使用 ios fmdb面试题_数据库

我们在执行inDatabase这个函数的时候其实是同步执行的,原因代码如下所示

iOS开发中FMDB的使用 ios fmdb面试题_sql_02




还有就是在你创建数据库文件的时候传的文件如今是@"" 也就是空的字符串的话,那就会在临时位置创建一个空的数据库,当FMDatabase连接关闭时,该数据库会被删除。如果为nil,会在内存中创建一个数据库,当FMDatabase连接关闭时,该数据库会被销毁。如果是一个文件路径磁盘中如果不存在此文件,会自动为你创建。为什么这么说,具体看图

它的说明中有写。

iOS开发中FMDB的使用 ios fmdb面试题_iOS开发中FMDB的使用_03