SQLite集成FMDB

使用前先导入libsqlite3.0.tbd

1.什么是FMDB?

FMDB是iOS平台的SQLite数据库框架

FMDB以OC的方式封装了SQLite的C语言API

2.FMDB有什么优势?

使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码

提供了多线程安全的数据库操作方法,有效地防止数据混乱

3.核心类

FMDatabase
    一个FMDatabase对象就代表一个单独的SQLite数据库
    用来执行SQL语句

FMResultSet
    使用FMDatabase执行查询后的结果集

FMDatabaseQueue
    用于在多线程中执行多个查询或更新,它是线程安全的

FMDB的基本使用

import Foundation

class SQLiteTool: NSObject {

    static let shareInstance = SQLiteTool()

    var db: FMDatabase?
    override init() {
        super.init()

        // 打开, 创建一个数据库
        db = FMDatabase(path: "/Users/xiaomage/Desktop/db/demo.sqlite")

        // 打开数据库
        if db!.open() {
            print("数据库打开成功")
            createTable()
        }else {
            print("数据库打开失败")
        }
    }

    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, withArgumentsInArray: nil)
        if result! {
            print("yes")
        }else {
            print("No")
        }
    }

    func insertRecord() -> () {
        let sql = "insert into t_stu(name, age, score) values('zhangsan', 15, 88)"
        let result = db?.executeUpdate(sql, withArgumentsInArray: nil)
        if result! {
            print("yes")
        }else {
            print("No")
        }
    }

    func queryAll() -> () {
        let sql = "select * from t_stu"
        guard let resultSet = db?.executeQuery(sql, withArgumentsInArray: nil) else {return}

        while resultSet.next() {
            let name = resultSet.stringForColumn("name")
            let age = resultSet.intForColumn("age")
            let score = resultSet.doubleForColumn("score")
            print(name, age, score)
        }

    }

    func executeStaments() -> () {

        let sql = "insert into t_stu(name, age, score) values('zhangsan', 15, 88);insert into t_stu(name, age, score) values('zhangsan2', 152, 881)"
        let result = db?.executeStatements(sql)
        if result! {
            print("多条语句执行成功")
        }else {
            print("失败")
        }
    }
}

FMDB的高级使用

FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题

为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类

import Foundation

class SQLiteTool: NSObject {

    static let shareInstance = SQLiteTool()

    var dbQueue: FMDatabaseQueue = FMDatabaseQueue(path: "/Users/xiaomage/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)"
        dbQueue.inDatabase { (db: FMDatabase!) in
            let result = db.executeUpdate(sql, withArgumentsInArray: nil)
            if result {
                print("yes")
            }else {
                print("No")
            }

        }
   }

    //事务
    func transaction() -> () {
        let sql = "insert into t_stu(name, age, score) values('lisi', 5, 8)"
        let sql2 = "insert into t_stu2(name, age, score) values('lisi2', 52, 82)"

        dbQueue.inTransaction { (db: FMDatabase!, rollback) in

            let result1 = db.executeUpdate(sql, withArgumentsInArray: nil)
            let result2 = db.executeUpdate(sql2, withArgumentsInArray: nil)

            if result1 && result2 {

            }else {
                rollback.memory = true
            }
        }
    }
}

results matching ""

    No results matching ""