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官方文檔的使用說明。