一 前言
学习如何使用FMDB框架,最好的办法就是阅读官方文档,在github上搜索“FMDB”,找到该框架,可以通过CocoaPods来安装,也可以Download下来,然后按照说明,把fmdb文件夹直接拖到项目里,那么你还需要导入libsqlite3.0.tbd,swift版还要创建桥接头文件,输入#import "FMDB.h"
二 示例
1 普通版
在桌面创建一个文件夹db,然后在项目里创建一个类SQLiteTool
import Foundation
class SQLiteTool : NSObject{
// 创建一个单例,方便调用方法
static let shareInstance = SQLiteTool()
var db:FMDatabase?
override init() {
super.init()
// 打开创建一个数据库
db = FMDatabase(path:"Users/huwenkuan/Desktop/db/demo.sqlite")
if (db?.open())! {
print("创建数据库成功")
createTable() // 默认就给他创建一个表
}else{
print("创建数据库失败")
}
}
// 创建一个表t_stu
func createTable() -> () {
let sql = "create table if not exists t_stu(id integer primary key autoincrement,name text not null,age integer,score real default 60) "
let result = db?.executeUpdate(sql, withArgumentsIn: nil)
if result! {
print("yes")
}else{
print("no")
}
}
// 插入一行数据
func insertRecord() -> () {
let sql = "insert into t_stu(name,age,score) values('zhangsan',19,99.0)"
let result = db?.executeUpdate(sql, withArgumentsIn: nil)
if result!{
print("插入数据成功")
}else{
print("插入数据失败")
}
}
// 查询所有数据
func queryAll() -> () {
let sql = "select * from t_stu"
// 用一个结构体接收返回的数据
guard let resultSet = db?.executeQuery(sql, withArgumentsIn: nil)
else{
return
}
// 遍历这个结构体
while resultSet.next() {
let name = resultSet.string(forColumn: "name")
let id = resultSet.int(forColumn: "id")
let age = resultSet.int(forColumn: "age")
let score = resultSet.double(forColumn: "score")
print(name,id,age,score)
}
}
// 执行多条语句
func executeStaments() -> () {
let sql = "insert into t_stu(name,age,score) values('zhangsanfeng',21,83.0);insert into t_stu(name,age,score) values('wangermazi',22,68.0);insert into t_stu(name,age,score) values('lala',23,85.0);insert into t_stu(name,age,score) values('lili',25,38.0)"
let result = db?.executeStatements(sql)
if result! {
print("多条语句执行成功")
}else{
print("多条语句执行失败")
}
}
}
在控制器调用查看结果:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
SQLiteTool.shareInstance.insertRecord()
、、、
}
}
2 线程安全版
class SQLiteTool : NSObject{
static let shareInstance = SQLiteTool()
// 给出路径,默认帮你创建数据库 ,无需调用open方法
var dbQueue:FMDatabaseQueue = FMDatabaseQueue(path:"Users/huwenkuan/Desktop/db/demo.sqlite")
// 创建表
func createTable() -> () {
let sql = "create table if not exists t_stu(id integer primary key autoincrement,name text not null,age integer,score real default 60) "
// inDatabase方法其实是开启了同步线程,归到同一个队列里去操作
dbQueue.inDatabase { (db:FMDatabase?) in
// 在此处执行创建表的语句,保证线程安全
let result = db?.executeUpdate(sql, withArgumentsIn: nil)
//
if result! {
print("yes")
}else{
print("no")
}
}
}
// 同时执行多条语句
func executeStaments() -> () {
let sql = "insert into t_stu(name,age,score) values('zhangsanfeng',21,83.0);insert into t_stu(name,age,score) values('wangermazi',22,68.0);insert into t_stu(name,age,score) values('lala',23,85.0);insert into t_stu(name,age,score) values('lili',25,38.0)"
// 线程安全做法
dbQueue.inDatabase { (db:FMDatabase?) in
let result = db?.executeStatements(sql)
//
if result! {
print("多条语句执行成功")
}else{
print("多条语句执行失败")
}
}
}
// 开启事务
func transaction() -> () {
let sql0 = "insert into t_stu(name,age,score) values('haha',8,20.0)"
let sql1 = "insert into t_stu(name,age,score) values('da',9,21.0)"
dbQueue.inTransaction { (db:FMDatabase?, rollback) in
let result0 = db?.executeUpdate(sql0, withArgumentsIn: nil)
let result1 = db?.executeUpdate(sql1, withArgumentsIn: nil)
if result0! && result1! {
print("事务执行成功")
}else{
// rollback?.memory = true
}
}
}
}
在控制器调用
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
SQLiteTool.shareInstance.transaction()
}
}