創建數據庫管理類
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())