• 默认配置
  • 加密
  • 自定义配置

    本文主要介绍如何对 WCDB Swift 特定的数据库进行基本的配置,而加密也是配置的其中较常用的一项。

    配置主要用控制数据库操作的行为。WCDB Swift 对 SQLite 的数据库做了基本的配置,如 journal_modefullfsync 等,以满足 WCDB Swift 的需求。同时,开发者也可以根据自己的需求,自定义配置项。

    默认配置

    WCDB Swift 提供的默认配置为:

    • PRAGMA locking_mode="NORMAL"
    • PRAGMA synchronous="NORMAL"
    • PRAGMA journal_mode="WAL"
    • PRAGMA fullfsync=1

    加密

    SQLite 支持的配置列表可参考其官方文档。

    加密功能可通过 setCipher(key:pageSize:) 接口开启,其函数原型为:

    1. // 该接口等同于配置 PRAGMA cipher="YourPassword",PRAGMA cipher_page_size=4096
    2. func setCipher(key optionalKey: Data?, // 密码
    3. pageSize: Int = 4096) // 加密页大小

    其中,pageSize 是加密的页大小参数,SQLCipher 在 iOS 上默认使用 4096,macOS 上默认使用 1024。而 WCDB Swift 则在所有平台上都适用 4096,以获得更好的性能。开发者一般不需要做特别的修改。

    对于在 macOS 上通过其他方式创建的加密数据库,在 WCDB Swift 使用时,可手动设置为 1024 以确保解密成功。更多关于 cipher_page_size 的信息,可以参考其官方文档。

    1. let database = Database(withPath: filePath)
    2. let password = "password".data(using: .ascii)
    3.  
    4. // 设置加密接口应在其他所有调用之前进行,否则会因无法解密而出错
    5. database.setCipher(key: password)
    6.  
    7. try database.insert(objects: object, intoTable: "sampleTable")

    开启加密会有部分性能损耗,详情请参考 Benchmark 与性能一章。

    值得注意的是,设置密码是一件很慎重的事情。对于已经创建且存在数据的数据库,无论是原本未加密想要改为加密,还是已经加密想要修改密码,都是成本非常高的操作,因此不要轻易使用。更多相关信息可以参考官方文档。

    自定义配置

    除了上述配置,开发者还可以根据自己的需求,通过 setConfig(named:with:orderBy: 接口设置其他配置。详细的配置列表可以参考 SQLite 的官方文档 和 SQLCipher 的官方文档。

    设置配置的接口函数原型如下:

    1. func setConfig(named name: String, // 配置名称,同名的配置会互相覆盖
    2. with callback: @escaping Config, // 配置的函数
    3. orderBy order: ConfigOrder) // 配置执行的顺序,顺序较小的配置优先执行。WCDB Swift 自带的配置从 0 开始。

    以下是设置配置的一个例子:

    1. database.setConfig(named: "secure_delete", with: { (handle: Handle) throws in
    2. let statementPragmaSecureDelete = StatementPragma().pragma(.secureDelete, to: true)
    3. try handle.exec()
    4. }, orderBy: 10)