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
我们在执行inDatabase这个函数的时候其实是同步执行的,原因代码如下所示
还有就是在你创建数据库文件的时候传的文件如今是@"" 也就是空的字符串的话,那就会在临时位置创建一个空的数据库,当FMDatabase连接关闭时,该数据库会被删除。如果为nil,会在内存中创建一个数据库,当FMDatabase连接关闭时,该数据库会被销毁。如果是一个文件路径磁盘中如果不存在此文件,会自动为你创建。为什么这么说,具体看图
它的说明中有写。