Post

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)
    }
}
This post is licensed under CC BY 4.0 by the author.