项目名称:GRDB.swift
GRDB.swift 是一个用 Swift 语言开发的 SQLite 数据库工具包,专注于应用开发。以下是该项目的核心功能和特点:
SQL生成:GRDB.swift 允许开发者通过增强应用模型来实现数据的持久化和检索,从而避免直接处理 SQL 语句和原始数据库行数据。
数据库观察:提供了数据库变化通知的功能,使得开发者可以及时响应数据库中数据的修改。
健壮的并发控制:支持多线程应用中的数据库高效使用,包括对 WAL(Write-Ahead Logging)数据库的支持,允许并发的读写操作。
数据库迁移:随着应用的发展,GRDB.swift 可以帮助开发者管理数据库模式的演变,通过迁移系统平滑地处理数据库结构的变化。
充分利用 SQLite 技能:GRDB.swift 不仅适合不需要高级 SQLite 特性的开发者,也欢迎那些希望利用 SQL 和 SQLite 技能的开发者。
多平台支持:GRDB.swift 支持 iOS、macOS、tvOS 和 watchOS 平台,覆盖了苹果生态中的主流操作系统。
版本要求:项目要求 iOS 13.0+、macOS 10.15+、tvOS 13.0+、watchOS 7.0+,以及 SQLite 3.20.0+ 和 Swift 6+/Xcode 16+ 的开发环境。
社区和支持:GRDB.swift 通过 Twitter、Mastodon 和 GitHub 问题跟踪系统提供发布公告和使用技巧。同时,开发者可以在 GitHub 讨论区或 GRDB 论坛中提出问题、寻求建议或进行交流。
文档和示例:项目提供了详尽的文档和示例代码,帮助开发者快速理解和开始使用 GRDB.swift。文档中包含了如何定义数据库模型、执行数据库操作、观察数据库变化等实用指南。
以下是项目中的一些关键代码示例,展示了如何使用 GRDB.swift 进行数据库操作:
import GRDB
let dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")
try dbQueue.write { db in
try db.create(table: "player") { t in
t.primaryKey("id", .text)
t.column("name", .text).notNull()
t.column("score", .integer).notNull()
}
}
struct Player: Codable, FetchableRecord, PersistableRecord {
var id: String
var name: String
var score: Int
}
try dbQueue.write { db in
try Player(id: "1", name: "Arthur", score: 100).insert(db)
try Player(id: "2", name: "Barbara", score: 1000).insert(db)
}
let players: [Player] = try dbQueue.read { db in
try Player.fetchAll(db)
}
访问原始SQL
try dbQueue.write { db in
try db.execute(sql: """
CREATE TABLE place (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
favorite BOOLEAN NOT NULL DEFAULT 0,
latitude DOUBLE NOT NULL,
longitude DOUBLE NOT NULL)
""")
try db.execute(sql: """
INSERT INTO place (title, favorite, latitude, longitude)
VALUES (?, ?, ?, ?)
""", arguments: ["Paris", true, 48.85341, 2.3488])
let parisId = db.lastInsertedRowID
try db.execute(literal: """
INSERT INTO place (title, favorite, latitude, longitude)
VALUES (\("King's Cross"), \(true), \(51.52151), \(-0.12763))
""")
}
访问原始数据库行和值
try dbQueue.read { db in
let rows = try Row.fetchCursor(db, sql: "SELECT * FROM place")
while let row = try rows.next() {
let title: String = row["title"]
let isFavorite: Bool = row["favorite"]
let coordinate = CLLocationCoordinate2D(
latitude: row["latitude"],
longitude: row["longitude"])
}
let placeCount = try Int.fetchOne(db, sql: "SELECT COUNT(*) FROM place")!
let placeTitles = try String.fetchAll(db, sql: "SELECT title FROM place")
}
数据库模型类型(即“记录”)
struct Place {
var id: Int64?
var title: String
var isFavorite: Bool
var coordinate: CLLocationCoordinate2D
}
try dbQueue.write { db in
try db.create(table: "place") { t in
t.autoIncrementedPrimaryKey("id")
t.column("title", .text).notNull()
t.column("favorite", .boolean).notNull().defaults(to: false)
t.column("longitude", .double).notNull()
t.column("latitude", .double).notNull()
}
var berlin = Place(
id: nil,
title: "Berlin",
isFavorite: false,
coordinate: CLLocationCoordinate2D(latitude: 52.52437, longitude: 13.41053))
try berlin.insert(db)
berlin.id
berlin.isFavorite = true
try berlin.update(db)
}
使用 Swift 查询接口查询数据库
try dbQueue.read { db in
let paris = try Place.find(db, id: 1)
let berlin = try Place.filter(Column("title") == "Berlin").fetchOne(db)
let favoritePlaces = try Place
.filter(Column("favorite") == true)
.order(Column("title"))
.fetchAll(db)
let favoriteCount = try Place.filter(Column("favorite")).fetchCount(db)
let places = try Place.fetchAll(db, sql: "SELECT * FROM place")
}
数据库变化通知
let observation = ValueObservation.tracking { db in
try Place.fetchAll(db)
}
let cancellable = observation.start(
in: dbQueue,
onError: { error in ... },
onChange: { (places: [Place]) in print("Fresh places: \(places)") })
以上代码示例展示了GRDB.swift项目中如何直接使用原始SQL语句、如何操作原始数据库行和值、如何定义和使用数据库模型(记录)、如何使用Swift查询接口以及如何监听数据库变化。这些功能是GRDB.swift提供的强大工具集的一部分,旨在帮助开发者更高效地使用SQLite数据库。