DBClient 1.4.2

DBClient 1.4.2

Yalantis 维护。



DBClient 1.4.2

DBClient

cocoapods swift Platform License

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")`

基础方法(CRUDobserve)对每种类型都是相同的,可以在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