WCDB之基本安装及使用(一)
参考:
前言
项目里由于需要存储很多基本信息在APP本地的
SQLite
数据库,可以说是一个重APP的客户端,项目一开始使用的是FMDB
,然后手动拼接sql语句,但是在字段版本升级、数据查询sql拼接很繁琐,对于不擅长sql语句的其他APP开发人员尤其痛苦,后续引入了WCDB.swift
后一开始还有点儿抵触,因为触发了不少bug及性能问题,后续修复好后也认真研究了WCDB.swift
的使用,发现使用起来非常便利
一、项目里引入,在Podfile
里引入:
1
2
3
4
5
6
7
target 'StudyWCDB' do
use_frameworks!
pod 'WCDB.swift'
end
二、在项目里定义模型及表的对应关系
创建数据库表对应的Model,Model需要实现TableCodable
协议,一般一个Model对应一个数据库表
1、模型属性var name: String?
等等
2、在模型里定义与表相关的字段enum CodingKeys: String, CodingTableKey
2.1、在模型里的enum CodingKeys
里定义Root
的真实模型类型typealias Root = xxx
2.2、在模型里的enum CodingKeys
里定义绑定static let objectRelationalMapping = TableBinding(CodingKeys.self)
2.3、在模型里的enum CodingKeys
里使用case配置表的字段名,一般跟模型的字段名一一对应case xxx
完整demo如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import Foundation
import WCDBSwift
final class BookDBModel: TableCodable {
// 1、定义模型里的字段
var name: String? // 书本平常
var picUrl: String? // 书本封面地址
var desc: String? // 书本介绍
// 2、实现CodingKeys、CodingTableKey协议
enum CodingKeys: String, CodingTableKey {
// 2.1、指定对象,一定要是当前类
typealias Root = BookDBModel
// 2.2、做绑定
static let objectRelationalMapping = TableBinding(CodingKeys.self)
// 2.3、定义的数据库表里的字段
case name
case picUrl
case desc
}
}
三、创建数据库及表
1、配置数据库地址:
let dbPath = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/test.db"
2、使用数据库地址初始化数据库:
let database = Database(at: dbPath)
3、使用数据库初始化表:
` try database.create(table: “sites”, of: WebSiteDBModel.self)`
完整初始化demo如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import Foundation
import WCDBSwift
class WebSiteDBWorker {
let dbPath = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/test.db"
var database: Database? = nil
init() {
// 初始化数据库对象
database = Database(at: dbPath)
do {
// 要初始化建表(没有创建过该表就建表,已经建过表了有字段变更就做响应处理)
try database?.create(table: "sites", of: WebSiteDBModel.self)
} catch {
print(error)
}
}
}
四、对数据进行基本的增删改查
插入、查询、删除、更新:demo如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import Foundation
import WCDBSwift
class BookDBWorker {
let dbPath = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/test.db"
var database: Database? = nil
// MARK: 初始化数据库和表
init() {
// 初始化数据库对象
database = Database(at: dbPath)
do {
// 要初始化建表(没有创建过该表就建表,已经建过表了有字段变更就做响应处理)
try database?.create(table: "books", of: BookDBModel.self)
} catch {
print(error)
}
}
// MARK: 插入数据
func addBooks(books: [BookDBModel]) -> Bool {
do {
try database?.insertOrReplace(books, intoTable: "books")
} catch {
print(error)
return false
}
return true
}
// MARK: 查询数据
func selectBooks() -> [BookDBModel]? {
do {
let list: [BookDBModel]? = try database?.getObjects(on: BookDBModel.Properties.all, fromTable: "books")
return list
} catch {
print(error)
return nil
}
}
func selectBook(name: String) -> BookDBModel? {
do {
let book: BookDBModel? = try database?.getObject(on: BookDBModel.Properties.all, fromTable: "books", where: BookDBModel.Properties.name == name)
return book
} catch {
print(error)
return nil
}
}
}
调用流程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
testBook()
}
func testBook() {
let worker = BookDBWorker()
// 设置数据
let datas = [
["name": "大学高数",
"picUrl": "https://bkimg.cdn.bcebos.com/pic/9922720e0cf3d7ca41810db7f21fbe096a63a9ff",
"desc": "高等数学是初等数学与大学阶段的高等数学的过渡",
"price": 99],
["name": "穷爸爸富爸爸",
"picUrl": "https://bkimg.cdn.bcebos.com/pic/e4dde71190ef76c61eca1e0f9f16fdfaaf5167fe",
"desc": "该书讲述了清崎有两个爸爸:“穷爸爸”是他的亲生父亲,一个高学历的教育官员",
"price": 100],
]
let models = datas.map {
let model = BookDBModel()
model.name = $0["name"] as? String
model.picUrl = $0["picUrl"] as? String
model.desc = $0["desc"] as? String
return model
}
let result = worker.addBooks(books: models)
let books = worker.selectBooks()
let book = worker.selectBook(name: "穷爸爸富爸爸")
print(result, books, book)
}
}