使用 GRDB 在 Swift 中操作 SQLite 数据库 | 快读
Posted SwiftCafe
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 GRDB 在 Swift 中操作 SQLite 数据库 | 快读相关的知识,希望对你有一定的参考价值。
关于 GRDB
说到 ios 中使用 SQLite,如果你有过 Objective-C 开发经验的话,那么你肯定会想到 FMDB。在 Objective-C 生态中,这个库的使用非常广泛。不光是 FMDB,就单说 SQLIte 本身,也已经基本成为移动端的数据存储标配。假如你要在移动端存储一些本地数据,一旦数据结构稍微复杂起来,SQLite 就是最好的选择。无论是在 iOS 还是 android 平台上,它的使用率都很高。
这次聊的 GRDB 就是针对 Swift 开发者的 SQLite 操作工具库。多啰嗦一句,为什么要有诸如 FMDB 或是 GRDB 这样的第三方组件呢,最主要的原因之一就是 SQLite 原生的 API 相对更偏底层
,作为应用开发者更需要的是一个能高效实用的 API 接口,这也是这些第三方组件主要所提供的价值了。
开始使用
首先我们需要安装 GRDB,简单的方式是通过 CocoaPods:
use_frameworks! pod 'GRDB.swift'
|
当然,你也可以通过其他包管理,比如 Carthage 或者完全手动安装。 这里我们不多赘述,稍后我把 GRDB 的 Github 主页发出来,里面有完整的介绍。
安装完成之后,就可以使用它的 API 接口了:
import GRDB // Pick one: let dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite") let dbPool = try DatabasePool(path: "/path/to/database.sqlite")
|
有两种方式建立数据库连接, DatabaseQueue
和 DatabasePool
。两种方式各有优劣,DatabaseQueue
不支持并发操作,但可以创建内存级别的数据库。 DatabasePool
对并发操作有内建的支持,但它会使用一种叫做 WAL 的模式操作数据库,也会带来一些弊端。
所以官方建议,如果你没有明确的目标,那么默认选择 DatabaseQueue
模式。
另外,关于 WAL 模式的详细内容可以参考 SQLite 官网的介绍 https://www.sqlite.org/wal.html
创建好数据库连接之后,我们就可以进行 SQL 操作了,比如建表和插入数据:
try dbQueue.inDatabase { db in try db.execute( "CREATE TABLE persons (" + "id INTEGER PRIMARY KEY," + "name TEXT NOT NULL," + "age INT" + ")") try db.execute( "INSERT INTO persons (name, age) VALUES (:name, :age)", arguments: ["name": "Barbara", "age": 39]) // Join multiple statements with a semicolon: try db.execute( "INSERT INTO persons (name, age) VALUES (?, ?); " + "INSERT INTO persons (name, age) VALUES (?, ?)", arguments: ["Arthur", 36, "Barbara", 39]) }
|
查询数据:
try dbQueue.inDatabase { db in if let row = try Row.fetchOne(db, "SELECT * FROM wines WHERE id = ?", arguments: [1]) { let name: String = row.value(named: "name") let color: Color = row.value(named: "color") print(name, color) } }
|
查询数据使用的是 Row.fetchOne 方法,这个方法可以查询一条记录。
当然除了直接使用 SQL 这种形式外, GRDB 还给我们提供了一组称为 Query Inerface 的方法:
try dbQueue.inDatabase { db in try db.create(table: "pointOfInterests") { t in t.column("id", .integer).primaryKey() t.column("title", .text).notNull() t.column("favorite", .boolean).notNull().defaults(to: false) t.column("longitude", .double).notNull() t.column("latitude", .double).notNull() }
// PointOfInterest? let paris = try PointOfInterest.fetchOne(db, key: 1)
// PointOfInterest? let titleColumn = Column("title") let berlin = try PointOfInterest.filter(titleColumn == "Berlin").fetchOne(db)
// [PointOfInterest] let favoriteColumn = Column("favorite") let favoritePois = try PointOfInterest .filter(favoriteColumn) .order(titleColumn) .fetchAll(db) }
|
结束
这次把 GRDB 给大家做了一个简要的介绍。GRDB 算的上是 Swift 社区中比较成熟的 SQLite 开源库,支持多个 Swift 版本,并且 API 接口使用起来也比较简洁,如果你的项目中有类似需要的话,GRDB 会是一个不错的选择。
当然这里给大家列出的只是它的九牛一毛,完整的文档大家还可以到它的 Github 主页上面继续了解 https://github.com/groue/GRDB.swift
以上是关于使用 GRDB 在 Swift 中操作 SQLite 数据库 | 快读的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 GRDB Swift 迁移更改列类型?
Xcode 10, Swift 4.2及iOS 12升级适配
GRDB使用SQLite的WAL模式
Django学习手册 - sqlit数据库操作
安卓应用版本升级时sqlit数据库升级
Android 手写数据库框架