RepoDB 是一个基于 GRDB 和 RxSwift 的 SQLite 数据库框架
功能
- 自动迁移
- 获取/保存/更新/删除/存在/计数方法
- 基于仓库模式与数据库交互
- RxSwift 支持
版本
Swift 版本 | RepoDB 版本 |
---|---|
5.1 | 0.0 |
5.0 | 0.0 |
需求
iOS 10.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+ • Swift 5+ / Xcode 11.4+
安装
要使用 CocoaPods 将 RepoDB 集成到您的 Xcode 项目中,请将其指定在您的 Podfile
中
pod 'RepoDB', '~> 0.0'
使用方法
本仓库中RepoDB-Demo包提供了示例代码。
初始化数据库实体(表)
要创建数据库表,请使用与DatabaseEntity
协议相匹配的结构。此结构的所有字段都必须是可选的。您可以通过定义静态属性databaseTableName
来设置表名称。属性包装器(注解/属性)@PrimaryKeyColumn
和@TableColumn
用于设置表列。@PrimaryKeyColumn
包含如下参数:name
(列名称)和autoincremented
(自动增加下一个值)。使用@PrimaryKeyColumn
将此字段设置为表的主键。@TableColumn
包含如下参数:name
(列名称)和nullable
(是否可以为空)。使用@TableColumn
将此字段设置为普通表列。
struct DatabasePost: DatabaseEntity {
static var databaseTableName: String = "Posts"
@PrimaryKeyColumn(name: "id", autoincremented: true)
var id: Int64?
@TableColumn(name: "text", nullable: false)
var text: String?
init() { }
}
初始化数据库和迁移
当启动应用程序以执行迁移时,调用方法并传递以下参数:migrationEntitiesTypes
(数据库实体类型的数组),migrationsName
(迁移名称)。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
AppDatabase.shared(mirgrationEntitiesTypes: [DatabasePost.self], migrationsName: "v1").setupDatabase(for: application)
return true
}
数据库操作
要执行对数据库的查询,您需要创建一个符合DatabaseRepository协议的空协议,在关联类型中传递数据库实体,将使用该仓库进行操作。
protocol PostsRepository: DatabaseRepository where Entity == DatabasePost { }
为了使用操作实体的方法,创建一个符合创建协议的空类。
class PostsDataRepository: PostsRepository { }
在调用访问数据库方法的类中,创建一个仓库的实例
private let postRepository: some PostsRepository = PostsDataRepository()
您现在可以访问数据库查询方法,例如 findAll()
、save(object:)
等
func fetchPosts() -> [DatabasePost] {
guard let posts = try? postRepository.findAll() else { return [] }
return posts
}
func savePost(post: DatabasePost) -> [DatabasePost] {
_ = try? postRepository.save(object: post)
return fetchPosts()
}
所有数据库查询的描述
func find(byId id: Int64) throws -> Entity
- 通过 id 返回数据库中的实体。
示例
var object = try? repository.find(byId: 1)
func find(filterKeys: [[String: DatabaseValueConvertible?]]) throws -> Entity
- 返回指定字段值的数据库实体。
示例
var object = try? repository.find(filterKeys: [["id": "1"], ["text": "Test"]])
func findAll(filterKeys: [[String: DatabaseValueConvertible?]]?) throws -> [Entity]
- 返回指定字段值数据库实体的数组。
示例
var objects = try? repository.findAll(filterKeys: [["text": "Test"]])
func findAll(page: Int, count: Int) throws -> DatabasePaginationEntity
- 返回一个包含元数据和指定长度实体的分页模型。
示例
var paginationObject = try? repository.findAll(page: 2, count: 10)
func save(object: Entity) throws -> Entity
- 将实体保存到数据库并返回保存的实体。
示例
var savedObject = try? repository.save(object: newObject)
func saveAll(objects: [Entity]) throws -> Entity
- 将实体数组保存到数据库并返回存储的实体。
示例
var savedObjects = try? repository.saveAll(objects: newObjects)
func update(object: Entity) throws -> Entity
- 更新数据库中的实体并返回更新的实体。
示例
var updateObject = try? repository.update(object: updateObject)
func updateAll(objects: [Entity]) throws -> [Entity]
- 更新数据库中的实体数组并返回更新的实体。
示例
var updatedObjects = try? repository.updateAll(objects: updatedObjects)
func delete(byId id: Int64) throws
- 从数据库中删除指定 id 的实体。
示例
try? repository.delete(byId: 1)
func delete(object: Entity) throws
- 从数据库中删除指定的实体。
示例
try? repository.delete(object: deletedObject)
func deleteAll(objects: [Entity]) throws
- 从数据库中删除指定实体数组。
示例
try? repository.deleteAll(objects: deletedObjects)
func exist(byId id: Int64) throws -> Bool
- 返回数据库中指定 id 实体的存在状态。
示例
var isExist = try? repository.exist(byId: 1)
func exist(object: Entity) throws -> Bool
- 返回数据库中指定实体的存在状态。
示例
var isExist = try? repository.exist(object: existObject)
func count() throws -> Int
- 返回数据库中实体的数量。
示例
var count = try? repository.count()
贡献
- 欢迎提交拉取请求。
- 对于主要更改,请先打开一个问题来讨论您想要进行的更改。
许可
RepoDB 采用 MIT 许可发布。详细信息请参阅 LICENSE。