Swift 數(shù)據(jù)庫之GRDB

LZGRDB

基于sql在GRDB的基礎(chǔ)上封裝一層以及自定義構(gòu)造SQL語句的buffer,直接操作sql,目前只支持在swift項(xiàng)目中使用,支持OC后期在完善。

安裝LZGRDB

Cocoapods

1. 在 Podfile 中添加 `pod 'LZGRDB', :git => 'https://github.com/HellotalkXJP/LZGRDB.git'`
2. 執(zhí)行 `pod install` 或 `pod update`

手動(dòng)安裝

1. 下載 LZGRDB/GRDB 文件夾內(nèi)的所有內(nèi)容。
2. 將 LZGRDB文件夾添加(拖放)到你的工程。

使用方法

創(chuàng)建數(shù)據(jù)庫

DatabaseInterface
  • func setDatabase(dbName: String = "default.sqlite", dbPath: String = NSHomeDirectory() + "/Documents/")
    設(shè)置數(shù)據(jù)庫路徑以及數(shù)據(jù)庫名字

dbName 數(shù)據(jù)庫的名稱 如: @"Users.sqlite", 如果dbName = nil,則默認(rèn)dbName=@"default.sqlite"
dbPath 數(shù)據(jù)庫的路徑, 如果dbPath = nil, 則路徑默認(rèn)NSHomeDirectory() + "/Documents/"

// 初始化數(shù)據(jù)庫
let interface = DatabaseInterface.sharedInterface
interface.setDatabase()
或
let interface = DatabaseInterface.sharedInterface
interface.setDatabase(dbName: "user.sqlite", dbPath: FilePath.userPathWith(userId: userId))
注意:如果自定義路徑下有中間路徑的話,則需要先創(chuàng)建中間路徑
GRDBManager
  • init(dbName: String, path: String)
    在初始化方法中,會(huì)先判斷是否有數(shù)據(jù)庫,沒有的話,則會(huì)默認(rèn)找到資源文件中的defaultSql.sql文件,然后執(zhí)行里面的sql語句。

  • private static var defaultConfiguration: Configuration
    數(shù)據(jù)庫的基礎(chǔ)配置

  • lazy var dbQueue: DatabaseQueue
    數(shù)據(jù)庫用于多線程事務(wù)處理

  • private var migrator: DatabaseMigrator
    數(shù)據(jù)庫數(shù)據(jù)升級(jí)/遷移處理

  • func executeDataMessage(_ message: inout DataMessage) --提供外部調(diào)用的方法
    通過外部傳過來的message對(duì)象,來執(zhí)行sql語句。判斷sync進(jìn)行同步/異步操作。執(zhí)行數(shù)據(jù)庫操作之后的結(jié)果寫入message對(duì)象中。

DatabaseService

主要是根據(jù)message對(duì)象中的連接類型判斷放在不同優(yōu)先級(jí)的隊(duì)列中

DatabaseConnect

連接數(shù)據(jù)庫,在不同的隊(duì)列中執(zhí)行SQL語句操作

SQLBuffer

sql語句構(gòu)造類

  • convenience init(sql: String)
    直接傳入sql語句

  • override init()
    另一種懶人方式構(gòu)造sql,先初始化,然后通過鏈?zhǔn)秸Z法的方式構(gòu)造sql

let insert = SQLBuffer().INSERT("student").SET("name", "insert1").SET("nick_name", "test1111").SET("age", 10.1).SET("gender", 0)
debugPrint("insert sql1: \(insert.description)")
// "insert sql1: INSERT INTO STUDENT (gender, nick_name, name, age) VALUES (0, \'test1111\', \'insert1\', 10.1)"

let replace = SQLBuffer().REPLACE("student").SET("id", 26).SET("name", "replace").SET("nick_name", "replace2").SET("age", 10.5).SET("gender", 1)
debugPrint("replace sql1: \(replace.description)")
// "replace sql1: REPLACE INTO STUDENT (gender, name, nick_name, id, age) VALUES (1, \'replace\', \'replace2\', 26, 10.5)"

let delete = SQLBuffer().DELETE("student").WHERE("name = 'test'").OR("nick_name = 'test1111'")
debugPrint("delete sql: \(delete.description)")
// "delete sql: DELETE FROM STUDENT WHERE name = \'test\' OR nick_name = \'test1111\'"

let update = SQLBuffer().UPDATE("student").SET("nick_name", "update_nick_name").SET("age", 1000).WHERE("name = 'insert1'").OR("nick_name = 'update'")
debugPrint("update sql1: \(update.description)")
// "update sql1: UPDATE STUDENT SET nick_name = \'update_nick_name\', age = 1000 WHERE name = \'insert1\' OR nick_name = \'update\'"

let select = SQLBuffer().SELECT("name, age").FROM("student").WHERE("name = 'xxxxx'").AND("nick_name = 'xxxxx'").OR("xxx = 'xxx'").GROUPBY("name,age").LIMIT(5).OFFSET(3).ORDERBY("age", "ASC")
debugPrint("select sql: \(select.description)")
// "select sql: SELECT name, age FROM student WHERE name = \'xxxxx\' AND nick_name = \'xxxxx\' OR xxx = \'xxx\' GROUP BY name,age ORDER BY age ASC LIMIT 3, 5"

insert.useArguments = true
debugPrint("insert sql2: \(insert.description)")
// "insert sql2: INSERT INTO STUDENT (gender, nick_name, name, age) VALUES (:gender, :nick_name, :name, :age)"

DataMessage

該類是貫穿全文的一個(gè)類,以下是該類中的一些成員變量的說明

// 是否已經(jīng)返回?cái)?shù)據(jù)庫執(zhí)行結(jié)果
var responded = false

// 是否是同步
var sync = false

// 數(shù)據(jù)庫操作sql語句
var sqlBuffer: SQLBuffer?

// 數(shù)據(jù)庫批量操作sql語句
var mutableSqlBuffer: MutableSQLBuffer?

// 業(yè)務(wù)邏輯類型
var logicType: DatabaseLogicType = .null

// 數(shù)據(jù)庫操作類型
var operationType: DatabaseOperationType = .query

// 數(shù)據(jù)庫連接類型
var databaseConnectType: DatabaseConnectType = .normal

// 數(shù)據(jù)庫操作結(jié)果
var resultSet: DataBaseResultSet?

// 消息唯一標(biāo)識(shí)
var identifier: String = ""

// 是否批量操作
private var batch = false

  • init(withSQLBuffer sqlBuffer: SQLBuffer)
    初始化方法
  • init(withMutalbeSQLBuffer mutableSQLBuffer: MutableSQLBuffer)
    批量sql初始化方法

使用

具體使用方法放在了AppDelegate.swift中,大家可以看下。

Thanks


LZGRDB都已經(jīng)放在了我的GitHub上,我這里只用到了GRDB部分小功能,代碼寫的比較簡(jiǎn)單,容易看的懂。其實(shí)GRDB里面的功能是很強(qiáng)大的,可以直接對(duì)象操作,具體的可以看GRDB官方文檔的使用說明。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容