美文网首页
FMDB在swift中的使用

FMDB在swift中的使用

作者: Cc大个子 | 来源:发表于2018-11-15 15:19 被阅读13次

    1.什么是FMDB

    由于iOS中使用C语言函数对原生SQLite数据库进行增删改查操作,复杂麻烦,所以就出现了一系列的SQLite API封装库,如FMDB。
    FMDB是针对libsqlite3框架进行封装的三方,它以OC的方式封装了SQLite的C语言的API,使用步骤与SQLite相似

    FMDB优点:

    1.使用面向对象,避免了复杂的C语言
    2.对比苹果自带的Core Data框架,更加轻量级和灵活
    3.提供了多线程安全处理数据库方法,保证安全和数据准确性
    FMDB 在Git上的下载链接地址:https://github.com/ccgus/fmdb

    主要对象

    1.FMDatabase: 数据库对象,一个对象代表一个数据库,通过sqlite可进行增删改查

    2.FMDatabaseQueue:多线程安全操作数据库 保证数据安全

    3.FMResultSet: 返回操作数据库后的结果集

    导入步骤

    很多文章都有 这里就不在详细叙述了

    就开始吧

    1.由于是swift 项目,导入fmdb文件之后 需要在桥接文件那里添加一下fmdb的头文件 #import"FMDB.h"

    这样可以愉快的写代码啦

    单例类 DatabaseHelper

    初始化

    func initDatabase() {
            let db = self.getDBQueue()
            db.inDatabase { (db) in
                //创建            
                self.createTable(db: db)
            }
        }
    

    初始化 FMDatabaseQueue(多线程安全)

    func getDBQueue() -> FMDatabaseQueue {
            if dbQueue == nil {
                let dbPath = self.getDataBasePath()
                dbQueue = FMDatabaseQueue(path: dbPath)
            }
            return dbQueue!
        }
    

    获取db存放路径

    func getDataBasePath() -> String{
            let docuPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
            let dbPath = docuPath.appending("/aliwatch.db")
            DDLogDebug("\(dbPath)")
            return dbPath
        }
    

    创建表

    func createTable(db: FMDatabase){
            let sql = "CREATE TABLE IF NOT EXISTS t_list_watch (" +
                "'_id' INTEGER PRIMARY KEY AUTOINCREMENT," +
                "'name' TEXT NOT NULL," +
                "'age' INTEGER DEFAULT 0)"
            let result = db.executeUpdate(sql, withArgumentsIn: [])
            if result {
                DDLogVerbose("create t_list_watch sucessfully!")
            }
        }
    

    插入数据

    func insertWatchInfo(name: String,age: Int) {
            // DatabaseHelper.shareInstance 是个单例类 
            let db: FMDatabaseQueue = SWDatabaseHelper.shareInstance.getDBQueue()
            db.inTransaction { (db, rollback) in
                let sql = "INSERT INTO t_list_watch (name,age) VALUES (?,?)"
                let result = db.executeUpdate(sql, withArgumentsIn: [name, age])
                if result {
                    print("DB insert WatchList:\(deviceModel!.dev_id!) success")
                } else {
                    print("DB insert WatchList:\(deviceModel!.dev_id!) fail")
                }
            }
        }
    

    查询数据

    func getList() {
            let db = SWDatabaseHelper.shareInstance.getDBQueue()
            db.inTransaction { (db, rollback) in
                let sql = "SELECT * FROM t_list_watch"
                let resultSet = db.executeQuery(sql, withArgumentsIn: [])
                guard resultSet != nil else {return}
                while(resultSet!.next()) {
                    print(resultSet?.string(forColumn: "name"))
                    print(resultSet?.string(forColumn: "age"))
                }
            }
        }
    

    删除

    let sql = "delete from 't_list_watch' where ID = ?"
    

    更新

    let sql = "update 't_student' set ID = ? where name = ?"
    

    谈谈FMDB中SQL的事务特性

    事务是恢复和并发控制的基本单位
    事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
    原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
    一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
    隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
    持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

    相关文章

      网友评论

          本文标题:FMDB在swift中的使用

          本文链接:https://www.haomeiwen.com/subject/ortyfqtx.html