GRDB.swift:Swift语言开发的SQLite数据库工具包





项目名称:GRDB.swift

GRDB.swift 是一个用 Swift 语言开发的 SQLite 数据库工具包,专注于应用开发。以下是该项目的核心功能和特点:

  1. SQL生成:GRDB.swift 允许开发者通过增强应用模型来实现数据的持久化和检索,从而避免直接处理 SQL 语句和原始数据库行数据。

  2. 数据库观察:提供了数据库变化通知的功能,使得开发者可以及时响应数据库中数据的修改。

  3. 健壮的并发控制:支持多线程应用中的数据库高效使用,包括对 WAL(Write-Ahead Logging)数据库的支持,允许并发的读写操作。

  4. 数据库迁移:随着应用的发展,GRDB.swift 可以帮助开发者管理数据库模式的演变,通过迁移系统平滑地处理数据库结构的变化。

  5. 充分利用 SQLite 技能:GRDB.swift 不仅适合不需要高级 SQLite 特性的开发者,也欢迎那些希望利用 SQL 和 SQLite 技能的开发者。

  6. 多平台支持:GRDB.swift 支持 iOS、macOS、tvOS 和 watchOS 平台,覆盖了苹果生态中的主流操作系统。

  7. 版本要求:项目要求 iOS 13.0+、macOS 10.15+、tvOS 13.0+、watchOS 7.0+,以及 SQLite 3.20.0+ 和 Swift 6+/Xcode 16+ 的开发环境。

  8. 社区和支持:GRDB.swift 通过 Twitter、Mastodon 和 GitHub 问题跟踪系统提供发布公告和使用技巧。同时,开发者可以在 GitHub 讨论区或 GRDB 论坛中提出问题、寻求建议或进行交流。

  9. 文档和示例:项目提供了详尽的文档和示例代码,帮助开发者快速理解和开始使用 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

    // Avoid SQL injection with SQL interpolation
    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
    // Fetch database rows
    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"])
    }
    
    // Fetch values
    let placeCount = try Int.fetchOne(db, sql: "SELECT COUNT(*) FROM place")!
    let placeTitles = try String.fetchAll(db, sql: "SELECT title FROM place") // [String]
}

数据库模型类型(即“记录”)

struct Place {
    var id: Int64?
    var title: String
    var isFavorite: Bool
    var coordinate: CLLocationCoordinate2D
}

// Turn Place into a "record" by adopting the protocols that provide fetching and persistence methods.
try dbQueue.write { db in
    // Create database table
    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 // some value
    
    berlin.isFavorite = true
    try berlin.update(db)
}

使用 Swift 查询接口查询数据库

try dbQueue.read { db in
    // Place
    let paris = try Place.find(db, id: 1)
    
    // Place?
    let berlin = try Place.filter(Column("title") == "Berlin").fetchOne(db)
    
    // [Place]
    let favoritePlaces = try Place
        .filter(Column("favorite") == true)
        .order(Column("title"))
        .fetchAll(db)
    
    // Int
    let favoriteCount = try Place.filter(Column("favorite")).fetchCount(db)
    
    // SQL is always welcome
    let places = try Place.fetchAll(db, sql: "SELECT * FROM place")
}

数据库变化通知

// Define the observed value
let observation = ValueObservation.tracking { db in
    try Place.fetchAll(db)
}

// Start observation
let cancellable = observation.start(
    in: dbQueue,
    onError: { error in ... },
    onChange: { (places: [Place]) in print("Fresh places: \(places)") })

以上代码示例展示了GRDB.swift项目中如何直接使用原始SQL语句、如何操作原始数据库行和值、如何定义和使用数据库模型(记录)、如何使用Swift查询接口以及如何监听数据库变化。这些功能是GRDB.swift提供的强大工具集的一部分,旨在帮助开发者更高效地使用SQLite数据库。

或许喜欢

Swifticon:从SwiftUI代码生成应用图标的工具

Swifticon是一个开源工具,允许开发者使用SwiftUI代码创建和生成应用图标,支持iOS、iPadOS和watchOS平台。

最近更新 2024-12-09

NavigationView - 简化SwiftUI导航的开源库

NavigationView是一个开源的SwiftUI库,旨在简化iOS应用中的导航过程,提供自定义动画、手势支持和代码清洁功能。

最近更新 2024-12-09

BetterSlider:自定义滑块控件,支持更多自定义功能

BetterSlider是一个用Swift开发的自定义滑块控件库,提供比标准Slider控件更多的自定义选项,支持范围选择滑块,适用于iOS和macOS应用开发。

最近更新 2024-12-14

热榜

Made with in Shangrao,China By 老雷

Copyright © devler.cn 1987 - Present

赣ICP备19009883号-1