DBClient
Cocoapods 集成
有三个 podspec
DBClient/Core
包含纯(CoreData/Realm-free)接口/类型,用于从实现中抽象出来。只有当您即将提供任何可用的存储类型的自定义实现时,才应使用它。DBClient/CoreData
包含 CoreData 实现。DBClient/Realm
包含 Realm 实现。
用法
根据您需要的数据库类型,创建一个客户端:`let client: DBClient = RealmDBClient(realm: realm)` 或 `let client: DBClient = CoreDataDBClient(forModel: "Users")`
基础方法(CRUD
,observe
)对每种类型都是相同的,可以在DBClient.swift
文档中找到。
您创建的每个模型都需要遵守具有两个属性的Stored
协议。
extension User: Stored {
public static var primaryKeyName: String? {
return "id"
}
public var valueOfPrimaryKey: CVarArg? {
return id
}
}
对于您创建的每个模型,您都需要按照下面的描述定义关联的数据库模型。
Realm
要采用 Realm,您需要为您想要支持的每个模型提供 RealmModelConvertible
协议的实现。`extension User: RealmModelConvertible`
该协议包含三个必需的方法。
第一个提供了一个与您的模型关联的类(realms的Object
的子类)
static func realmClass() -> Object.Type {
return ObjectUser.self
}
第二个将抽象领域的Object
转换为您的模型
static func from(_ realmObject: Object) -> Stored {
guard let objectUser = realmObject as? ObjectUser else {
fatalError("Can't create `User` from \(realmObject)")
}
return User(id: objectUser.id, name: objectUser.name)
}
最后一个将您的模型转换为realms对象
func toRealmObject() -> Object {
let user = ObjectUser()
user.id = id
user.name = name
return user
}
CoreData
要采用CoreData,您需要创建您的模型,并为客户端构造函数(也可以指定包)提供合适的文件名,并为您的每个模型提供CoreDataModelConvertible
协议的实现。extension User: CoreDataModelConvertible
该协议要求实现四个方法和一个字段。每个方法/字段的文档可以在CoreDataDBClient.swift
中找到
在字段entityName
中,您应提供实体名称(等于您的模型中指定的名称)
public static var entityName: String {
return String(describing: self)
}
下一个方法用于确定与您的模型关联的NSManagedObject
祖先
public static func managedObjectClass() -> NSManagedObject.Type {
return ManagedUser.self
}
下一个方法确定给定的对象是否等于当前对象
func isPrimaryValueEqualTo(value: Any) -> Bool {
if let value = value as? String {
return value == id
}
return false
}
下一个方法用于将NSManagedObject
转换为您的模型。在此处使用fatalError
失败是开发者的责任。
public static func from(_ managedObject: NSManagedObject) -> Stored {
guard let managedUser = managedObject as? ManagedUser else {
fatalError("can't create User object from object \(managedObject)")
}
guard let id = managedUser.id,
let name = managedUser.name else {
fatalError("can't get required properties for user \(managedObject)")
}
return User(id: id, name: name)
}
最后一个方法用于根据您的模型在给定的上下文中创建/更新NSManagedObject
public func upsertManagedObject(in context: NSManagedObjectContext, existedInstance: NSManagedObject?) -> NSManagedObject {
var user: ManagedUser
if let result = existedInstance as? ManagedUser { // fetch existing
user = result
} else { // or create new
user = NSEntityDescription.insertNewObject(
forEntityName: User.entityName,
into: context
) as! ManagedUser
}
user.id = id
user.name = name
return user
}
版本历史记录
版本 | Swift | 依赖关系 | iOS |
---|---|---|---|
1.4.2 |
5 | RealmSwift 3.15.0, YALResult 1.4 | 10 |
1.3 |
4.2 | RealmSwift 3.11.1, YALResult 1.1 | 10 |
1.0 |
4.2 | RealmSwift 2.10.1, YALResult 1.0 | 10 |
0.7 |
4.0 | RealmSwift 2.10.1, BoltsSwift 1.4 | 9 |
0.6 |
4 | RealmSwift 2.10.1, BoltsSwift 1.3 | 9 |
0.4.2 |
3.2 | RealmSwift 2.1.1, BoltsSwift 1.3 | 9 |