适用于SQLite3的、由SQLite.swift包装的开发友好型的对象关系模型
struct Person: SQLiteModel {
// Required by SQLiteModel protocol
var localID: SQLiteModelID = -1
static let Name = Expression<String>("name")
static let Age = Expression<Int>("age")
static let BFF = Relationship<Person?>("best_friend")
// Required by SQLiteModel protocol
static func buildTable(tableBuilder: TableBuilder) {
tableBuilder.column(Name)
tableBuilder.column(Age, defaultValue: 0)
tableBuilder.relationship(BFF, mappedFrom: self)
}
}
let jack = try Person.new([
Person.Age <- 10,
Person.Name <- "Jack"
])
let jill = try Person.new([
Person.Age <- 12,
Person.Name <- "Jill"
])
// Set age
// same as jack.set(Person.Age, 11)
jack <| Person.Age |> 11
// Get age
// same as jack.get(Person.Age)
let age = jack => Person.Age
// Set Best Friend
// same as jack.set(Person.BFF, jill)
jack <| Person.BFF |> jill
let people = try Person.fetchAll()
SQLiteModel需要Swift 2(和Xcode 7)或更高版本。
要将SQLite.swift作为Xcode子项目安装
在您的目标“通用”选项卡中,点击“链接框架和库”下的“+”按钮。
选择针对您平台正确的“SQLite.framework”。
添加.
此仓库的wiki包含大量文档。
市面上有很多优秀的存储解决方案,其中Realm和CoreData最为流行。这些解决方案的最大问题是它们强制您的模型为引用类型(类)而不是值类型(结构体)。
苹果的文档中列出了一些条件,如果条件为真,结构体可能比类是一个更好的选择。这里是具体的说明。以下条件尤其相关。
结构体的主要用途是封装一些相对简单的数据值。
听起来数据库行符合这个描述。理想情况下,如果试图模拟数据库行,最好使用结构体,SQLiteModel 支持使用结构体。
话虽如此,结构体并不总是最佳选择。SQLiteModel 也支持使用类,但到目前为止,它们必须是 final
的。
还存在许多对 SQLite 进行包装但并非对象关系模型的库。SQLite.swift 和 FMDB 是两个提供此类功能的优秀库。这些库功能非常强大且灵活,但它们需要一些时间才能正确设置,因为它们需要大量的样板代码。
使用 SQLiteModel,样板代码已经编写好了。显然,你牺牲了一些灵活性以换取使用便利,但对我来说,对于大多数数据存储需求来说,这是可以接受的。
这里有几个如何使用 SQLiteModel 的示例。
此存储库包含一个可以用于探索 SQLiteModel 语法和功能的游乐场。请确保打开 SQLiteModel.xcodeproject
,因为这个游乐场引入了 SQLiteModel
框架,并确保你正在使用 SQLiteModel-iOS
规划。
可以在这里找到 iOS、TVOS 和 OSX 的示例应用程序存储库。链接。这些项目都使用 CocoaPods,因此请确保打开 .xcworkspace
以运行它们。
提供的 iOS 示例是最好的、最全面的示例,如何使用 SQLiteModel。的应用程序是一个博客平台,允许用户创建、删除和保存博客文章。用户还可以在博客中使用关系添加图片,并在另一个选项卡中查看所有图片。
请随时通过电子邮件与我联系 [email protected]。我很乐意听听您的想法,或者看看这个是如何被使用的例子。
您也可以在推特上 @JeffHurray 寻找我的联系方式。
如果您想添加功能,请打开一个问题报告和/或创建一个拉取请求。
非常感谢 Stephen Celis 编写 SQLite.swift
,我认为它是今天存在的最好的 Swift 开源库之一。
SQLiteModel 在 MIT 许可下可用。更多信息请参阅 LICENSE 文件。