测试已测试 | ✓ |
语言支持的语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2016年5月 |
SPM支持 Swift Package Manager (SPM) | ✗ |
由 Øyvind Grimnes 维护。
市面上有很多库旨在帮助开发者轻松创建和使用 SQLite 数据库。不幸的是,开发者仍然不得不在诸如编写表定义和 SQL 查询等简单任务中纠缠不清。SwiftyDB 自动处理所有你不希望花费时间做的事情。
您可以在此处找到文档
内容
特性
用法
访问数据库
同步访问
异步访问
结果格式
过滤结果
定义您的类
主键
忽略属性
如何检索对象
安装
许可证
几乎即插即用。您只需创建一个 SwiftyDB 实例,所有操作将会在幕后自动处理
告诉 SwiftyDB 您想命名的数据库名称,然后就可以开始了。如果未找到具有提供名称的数据库,则会创建它。
let database = SwiftyDB(databaseName: "dogtopia")
database.addObject(dog, update: true)
database.addObjects(dogs, update: true)
使用与类型属性匹配的数据类型检索数据
/* Array of dictionaries representing `Dog` objects from the database */
database.dataForType(Dog.self)
database.dataForType(Dog.self, matchingFilters: ["id": 1])
狗数据示例
[
"id": 1, // As an Int
"name": "Ghost", // As a String
"owner": "John Snow", // As a String
"birth": August 6, 1996 // As an NSDate
]
使用数据库中的数据检索对象
database.objectsForType(Dog.self)
database.objectsForType(Dog.self, matchingFilters: ["id": 1])
为了检索对象,Swift 目前对你的类施加了一些限制
database.deleteObjectsForType(Dog.self)
database.deleteObjectsForType(Dog.self, matchingFilters: ["name": "Max"])
database.asyncAddObject(dog) { (result) -> Void in
if let error = result.error {
// Handle error
}
}
使用与类型属性匹配的数据类型检索数据
database.asyncDataForType(Dog.self) { (result) -> Void in
if let data = result.value {
// Process data
}
}
使用与类型属性匹配的数据类型检索数据
database.asyncObjectsForType(Dog.self) { (result) -> Void in
if let objects = result.value {
// Handle objects
}
}
为了检索对象,Swift 目前对你的类施加了一些限制
database.asyncDeleteObjectsForType(Dog.self) { (result) -> Void in
if let error = result.error {
// Handle error
}
}
Filter
对象用于过滤查询。所有过滤器在查询数据库之前都将转换为SQLite格式。
定义过滤器最简单的方式是使用一个字典
database.objectsForType(Dog.self, matchingFilters: ["name": "Ghost"])
将检索所有名称为‘Ghost’的对象
对于更复杂的过滤器,你可以实例化一个新的Filter
对象,并定义你的过滤器
let filter = Filter.equal("name", value: "Ghost")
.like("owner", pattern: "J_h%")
.greaterThan("id", value: 3)
database.objectsForType(Dog.self, matchingFilters: filter)
在文档中查看所有可用的过滤器。
由于这些内容作为 blob 存储在数据库中,因此无法使用存储集合的内容来过滤结果
所有查询都返回一个Result
。它将是一个包含查询数据的.Success
包装,或是一个包含抛出错误的.Error
封装。
enum Result<A: Any>: BooleanType {
case Success(A)
case Error(ErrorType)
var data: A?
var error: ErrorType?
var isSuccess: Bool
var boolValue: Bool {return isSuccess}
}
Result
的实现使其成为一款通用工具,可以(希望如此)适配你的编程风格
你可以通过value
属性捕获查询的数据。如果抛出了错误,这个属性将为nil
。
if let object = result.value {
// Process objects
}
你可以这样检测错误
if !database.addObject(dog) {
// An error occured
}
或者这样通过error
属性捕获它
if let error = result.error {
// Process objects
}
如果你想,你可以甚至搬出你的铁锤开始敲坚果
switch result {
case .Success(let value):
// Process value
case .Error(let error):
// Handle error
}
让我们用一个简单的Dog
类作为示例
class Dog {
var id: Int?
var name: String?
var owner: String?
var birth: NSDate?
}
所有对象都必须遵守Storable
协议。
public protocol Storable {
init()
}
通过添加Storable
协议并实现init()
,你已经准备好了。
class Dog: Storable {
var id: Int?
var name: String?
var owner: String?
var birth: NSDate?
required init() {}
}
SwiftyDB支持继承。类和超类中的有效属性将被自动存储。
建议实现PrimaryKeys
协议。 primaryKeys()
方法应返回一个唯一标识对象的属性名集合。
extension Dog: PrimaryKeys {
class func primaryKeys() -> Set<String> {
return ["id"]
}
}
如果你的类中包含你不想在数据库中出现属性,可以实施IgnoredProperties
协议。
extension Dog: IgnoredProperties {
class func ignoredProperties() -> Set<String> {
return ["name"]
}
}
不属于
Value
协议的数据类型的属性将被SwiftyDB自动忽略
SwiftyDB也可以从数据库中检索具有所有属性分配数据的完整对象。为了实现这一点,类型必须是NSObject
的子类,所有属性类型都必须可以在Objective-C中表示。这是因为Swift目前不支持属性的动态分配。
动态属性类型
Int
UInt
Float
Double
Bool
String
/ String?
NSNumber
/ NSNumber?
NSString
/ NSString?
NSDate
/ NSDate?
NSData
/ NSData?
一个更新后的Dog类,可用于从数据库中检索完整对象
class Dog: NSObject, Storable {
var id: NSNumber? // Notice that 'Int?' is not supported. Use NSNumber? instead
var name: String?
var owner: String?
var birth: NSDate?
override required init() {
super.init()
}
}
SwiftyDB通过Cocoapods提供。要安装它,只需将以下行添加到您的Podfile中
pod "SwiftyDB"
Øyvind Grimnes, [email protected]
SwiftyDB在MIT许可下可用。有关更多信息,请参阅LICENSE文件。