SharingGRDB

SwiftData 和 @Query 的轻量级替代品。

CI

了解更多

这个库的动机和设计源于 Point-Free 上的许多剧集,这是一个由 Brandon WilliamsStephen Celis 主持的视频系列,探索 Swift 语言中的高级编程主题。 为了支持这个库的持续开发,请立即订阅

video poster image

概览

SharingGRDB 是 SwiftData 和 @Query 宏的轻量级替代品,可以部署到 iOS 13 世代的目标平台。

SharingGRDB SwiftData
@SharedReader(
  .fetchAll(
    sql: "SELECT * FROM items"
  )
)
var items: [Item]
@Query
var items: [Item]

以上两个示例都从外部数据存储中获取项目,并且都由 SwiftUI 自动观察,以便在外部数据更改时重新计算视图,但 SharingGRDB 直接由 SQLite 使用 SharingGRDB 驱动,并且可以从 UIKit、@Observable 模型等中使用。

注意:不需要将查询编写为原始 SQL 字符串,也可以使用查询构建器。 有关 SharingGRDB 查询功能的更多信息,请参阅获取模型数据

快速开始

在 SharingGRDB 的属性包装器可以从 SQLite 获取数据之前,您需要在运行时提供它应该使用的默认数据库。 这通常在您应用程序生命周期的早期完成,例如 SwiftUI 中的应用程序入口点,并且类似于在 SwiftData 中配置模型存储

SharingGRDB SwiftData
@main
struct MyApp: App {
  init() {
    prepareDependencies {
      let db = try! DatabaseQueue(
        // Create/migrate a database 
        // connection
      )
      $0.defaultDatabase = db
    }
  }
  // ...
}
@main
struct MyApp: App {
  let container = { 
    // Create/configure a container
    try! ModelContainer(/* ... */)
  }()
  
  var body: some Scene {
    WindowGroup {
      ContentView()
        .modelContainer(container)
    }
  }
}

注意:有关准备 SQLite 数据库的更多信息,请参阅准备 SQLite 数据库

defaultDatabase 连接由 SharingGRDB 的策略隐式使用,例如 fetchAll

@SharedReader(.fetchAll(sql: "SELECT * FROM items"))
var items: [Item]

您可以在整个应用程序中访问此数据库,方式类似于通过属性包装器访问模型上下文

SharingGRDB SwiftData
@Dependency(\.defaultDatabase) 
var database
    
var newItem = Item(/* ... */)
try database.write { db in
  try newItem.insert(db)
}
@Environment(\.modelContext) 
var modelContext
    
let newItem = Item(/* ... */)
modelContext.insert(newItem)
try modelContext.save()

注意:有关 SharingGRDB 如何与 SwiftData 进行比较的更多信息,请参阅与 SwiftData 的比较

这就是您开始使用 SharingGRDB 所需要知道的全部内容,但还有更多内容需要学习。 阅读下面的文章,了解如何最好地利用这个库

需要 SQLite 知识

SQLite 是软件历史上最成熟和广泛分布的软件之一。 掌握 SQLite 知识对于任何应用程序开发人员来说都是一项很棒的技能,并且这个库不想对您隐瞒它。 因此,我们认为为了最好地运用这个库,您应该熟悉 SQLite 的基础知识,包括模式设计和规范化、SQL 查询(包括连接和聚合)以及性能(包括索引)。

凭借一些基本知识,您可以将此库应用于您的数据库模式,以便查询数据并在数据库中的数据更改时保持视图最新。 您可以使用 GRDB 的 query builder API 来查询您的数据库,或者您可以使用原始 SQL 查询,以及 SQL 提供的所有强大功能。

演示

这个仓库附带大量示例,演示如何使用 Sharing 解决常见和复杂的问题。 查看目录以查看所有示例,包括

文档

此处提供了发布版本和 main 的文档

安装

您可以通过将 SharingGRDB 作为包添加到您的项目中,将其添加到 Xcode 项目中。

https://github.com/pointfreeco/sharing-grdb

如果您想在 SwiftPM 项目中使用 SharingGRDB,只需将其添加到您的 Package.swift

dependencies: [
  .package(url: "https://github.com/pointfreeco/sharing-grdb", from: "0.1.0")
]

然后将产品添加到任何需要访问该库的目标

.product(name: "SharingGRDB", package: "sharing-grdb"),

社区

如果您想讨论这个库或对如何使用它来解决特定问题有疑问,您可以在以下几个地方与 Point-Free 爱好者进行讨论

许可

此库在 MIT 许可下发布。 有关详细信息,请参阅 LICENSE