swift數據庫GRDB框架使用(iOS)


創建數據庫管理類

DataManager.swift

import GRDB

struct DataBaseName {
    /// 數據庫名字
    static let test = "test.db"
}

/// 數據庫表名
struct TableName {
    /// 學生
    static let student = "student"
}

/// 數據庫連接
class DBManager: NSObject {
    /// 數據庫路徑
    private static var dbPath: String = {
        // 獲取工程內容數據庫名字
        let filePath: String = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first!.appending("/\(DataBaseName.test)")
        
        //print("數據庫地址:", filePath as Any)
        return filePath
    }()
    
    /// 數據庫配置
    private static var configuration: Configuration = {
        // 配置
        var configuration = Configuration()
        // 設置超時
        configuration.busyMode = Database.BusyMode.timeout(5.0)
        // 試圖訪問鎖着的數據
        //configuration.busyMode = Database.BusyMode.immediateError
        
        return configuration
    }()
    
    // MARK: 創建數據 多線程
    /// 數據庫 用於多線程事務處理
    static var dbQueue: DatabaseQueue = {
        // 創建數據庫
        let db = try! DatabaseQueue(path: DBManager.dbPath, configuration: DBManager.configuration)
        db.releaseMemory()
        // 設備版本
        return db
    }()
}

學生類:

Student.swift

import GRDB

/// 學生類
struct Student: Codable {
    /// 名字
    var name: String?
    /// 昵稱
    var nick_name: String?
    /// 年齡
    var age: Int?
    /// 性別
    var gender: Bool?
    
    /// 設置行名
    private enum Columns: String, CodingKey, ColumnExpression {
        /// 名字
        case name
        /// 昵稱
        case nick_name
        /// 年齡
        case age
        /// 性別
        case gender
    }
}

extension Student: MutablePersistableRecord, FetchableRecord {
    /// 獲取數據庫對象
    private static let dbQueue: DatabaseQueue = DBManager.dbQueue
    
    //MARK: 創建
    /// 創建數據庫
    private static func createTable() -> Void {
        try! self.dbQueue.inDatabase { (db) -> Void in
            // 判斷是否存在數據庫
            if try db.tableExists(TableName.student) {
                //debugPrint("表已經存在")
                return
            }
            // 創建數據庫表
            try db.create(table: TableName.student, temporary: false, ifNotExists: true, body: { (t) in
                // ID
                t.column(Columns.name.rawValue, Database.ColumnType.text)
                // 名字
                t.column(Columns.nick_name.rawValue, Database.ColumnType.text)
                // 朝代
                t.column(Columns.age.rawValue, Database.ColumnType.integer)
                // 簡介
                t.column(Columns.gender.rawValue, Database.ColumnType.boolean)
            })
        }
    }
    
    //MARK: 插入
    /// 插入單個數據
    static func insert(student: Student) -> Void {
        // 判斷是否存在
        guard Student.query(name: student.name!) == nil else {
            debugPrint("插入學生 內容重復")
            // 更新
            self.update(student: student)
            return
        }
        
        // 創建表
        self.createTable()
        // 事務
        try! self.dbQueue.inTransaction { (db) -> Database.TransactionCompletion in
            do {
                var studentTemp = student
                // 插入到數據庫
                try studentTemp.insert(db)
                return Database.TransactionCompletion.commit
            } catch {
                return Database.TransactionCompletion.rollback
            }
        }
    }
    
    //MARK: 查詢
    static func query(name: String) -> Student? {
        // 創建數據庫
        self.createTable()
        // 返回查詢結果
        return try! self.dbQueue.unsafeRead({ (db) -> Student? in
            return try Student.filter(Column(Columns.name.rawValue) == name).fetchOne(db)
        })
    }
    
    /// 查詢所有
    static func queryAll() -> [Student] {
        // 創建數據庫
        self.createTable()
        // 返回查詢結果
        return try! self.dbQueue.unsafeRead({ (db) -> [Student] in
            return try Student.fetchAll(db)
        })
    }
    
    //MARK: 更新
    /// 更新
    static func update(student: Student) -> Void {
        /// 創建數據庫表
        self.createTable()
        // 事務 更新場景
        try! self.dbQueue.inTransaction { (db) -> Database.TransactionCompletion in
            do {
                // 賦值
                try student.update(db)
                return Database.TransactionCompletion.commit
            } catch {
                return Database.TransactionCompletion.rollback
            }
        }
    }
    
    //MARK: 刪除
    /// 根據名字刪除學生
    static func delete(name: String) -> Void {
        // 查詢
        guard let student = self.query(name: name) else {
            return
        }
        // 刪除
        self.delete(student: student)
    }
    
    /// 刪除單個學生
    static func delete(student: Student) -> Void {
        // 是否有數據庫表
        self.createTable()
        // 事務
        try! self.dbQueue.inTransaction { (db) -> Database.TransactionCompletion in
            do {
                // 刪除數據
                try student.delete(db)
                return Database.TransactionCompletion.commit
            } catch {
                return Database.TransactionCompletion.rollback
            }
        }
    }
}

GRBD數據庫操作:

    // 插入數據
    let stu = Student(name: "張三", nick_name: "哈皮", age: 30, gender: true)
    Student.insert(student: stu)

    // 查詢數據
    debugPrint("查詢所有數據:", Student.queryAll())

代碼demo下載地址

MyInsight_iOS.

參考

使用 GRDB 在 Swift 中操作 SQLite 數據庫


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM