一、FMDB的简单介绍
- 1.1、FMDB 的概念
- FMDB是iOS平台的SQLite数据库框架
- FMDB以OC的方式封装了SQLite的C语言的API
- 1.2、FMDB的优点
- 使用起来更加面向对象,省去了很多的麻烦,冗余的C语言代码
- 提供了多线程安全的数据库操作方法,有效地防止数据库的混乱
- 1.3、FMDB 的三个主要的类
- FMDatabase :
private var db: OpaquePointer? = nil
- 一个FMDatabase对象就代表一个单独的SQLite数据库
- 用来执行SQL语句
- FMResultSet :使用FMDatabase执行查询后的结果集
- FMDatabaseQueue: 用于在多线程中执行多个查询或更新,它是线程安全的
二、在Swift里面使用FMDB是无法使用CocoaPods导入的,需要做如下的步骤
2.1、在官方gitHub下载FMDB
还有一个扩展类:
2.2、创建桥接文件
- 2.3、桥接文件里面导入 :
#import "FMDB.h"
- 2.4、添加
libsqlite3.tbd
库,General
->TARGETS
->Linked Frameorks and Libraries
点击加号添加下面的库
- 2.5、做完上面的步骤运行一下,如果没有报错就证明你导入成功了
三、FMDB的使用
- 3.0、FMDB三个重要的类:
- 1、
FMDatabase
数据库对象 (线程不安全) - 2、
FMResultSet
结果集 - 3、
FMDatabaseQueue
数据库对象(线程安全)
- 3.1、创建一个类(
JKSQLiteManger
)来管理数据,将其设置为单粒
class JKSQLiteManger: NSObject { // MARK: 1、单粒 private static let manger: JKSQLiteManger = JKSQLiteManger() class func shareManger() -> JKSQLiteManger { return manger } }
- 3.2、打开数据库,创建表(只有先做这两步才可以做其他的操作)
// MARK: 2、数据库的创建&表的创建 var db: FMDatabase? func openDB(DBName: String) { // 1.根据传入的数据库名称拼接数据库的路径 let path = String.cacheDir()+"/\(DBName)" print("数据库的路径=\(path)") // 2.创建数据库对象 db = FMDatabase(path: path) // 3.打开数据库 // open方法特点: /** 如果指定路径对应的数据库文件已经存在, 就会直接打开 否则, 就会创建一个新的 */ if !db!.open() { print("打开数据库失败") return } createTable() } // MARK: 3、创建表 func createTable() { // 1.编写SQL语句 // id: 主键 name和age是字段名 let sql = "CREATE TABLE IF NOT EXISTS T_Person( \n" + "id INTEGER PRIMARY KEY AUTOINCREMENT, \n" + "name TEXT, \n" + "age INTEGER \n" + "); \n" // 2.执行SQL语句 // 注意点: 在FMDB中除了查询意外, 都称之为更新 if db!.executeUpdate(sql: sql, AnyObject.self as AnyObject){ print("创建表成功") }else{ print("创建表失败") } }
- 注意点: 在FMDB中除了查询意外, 都称之为更新
- 3.3、 插入一条数据(下面两种方式区别是:使用的方法不同),注意预编译插入
- 正常的插入一条数据
// 1、编写SQLite语句 let sql = "INSERT INTO T_Person (name,age) VALUES ('\(name!)',\(age));" // 2、执行SQLite语句 return JKSQLiteManger.shareManger().db!.executeUpdate(sql, withArgumentsIn: [])
- 预编译插入一条数据
// 1、编写SQLite语句 let sql = "INSERT INTO T_Person (name,age) VALUES (?,?);" // 2、执行SQLite语句 return JKSQLiteManger.shareManger().db!.executeUpdate(sql: sql, name! as AnyObject,age a
- 3.4、更新数据
// 1、编写SQLite语句 let sql = "UPDATE T_Person SET name = '\(name!)' WHERE age = \(self.age);" // 2、执行SQLite语句 return JKSQLiteManger.shareManger().db!.executeUpdate(sql, withArgumentsIn: [])
- 3.5、删除数据
// 1、编写SQLite语句 let sql = "DELETE FROM T_Person WHERE age = \(self.age);" // 2、执行SQLite语句 return JKSQLiteManger.shareManger().db!.executeUpdate(sql, withArgumentsIn: [])
- 3.6、查询数据
let sql = "SELECT * FROM T_Person;" let res = JKSQLiteManger.shareManger().db!.executeQuery(sql, withArgumentsIn: []) var models = [Person]() while res!.next() { let p = Person() p.id = (res?.int(forColumn: "id"))! p.name = res?.string(forColumn: "name") p.age = (res?.int(forColumn: "age"))! models.append(p) } return models