DataKernel 0.4.0

DataKernel 0.4.0

测试测试
Lang语言 SwiftSwift
许可 MIT
发布最近发布2017年12月
SwiftSwift 版本4.0
SPM支持 SPM

MrDekk 维护。



DataKernel

什么是 DataKernel?

DataKernel 是围绕 CoreData 栈的简约封装,以简化持久性操作。它主要受到 SugarRecord 的启发,但没有外部依赖(当然除了 Cocoa 外)并进行了一些微调。它涵盖了单元测试。

如果您有任何建议,请提交问题。如果您需要使用示例 - 请参阅单元测试,它非常简单直观。

特性

  • Swift(已测试在 xCode 7.2.1,xCode 7.3.0)
  • 基于协议的设计
  • 彻底测试
  • 积极支持
  • 丰富的操作集(但我想可能还有一些东西被遗漏了)
  • 目前没有 iCloud(但计划中)

注意

  • context.wipe 在 iOS 9 和 OSX 10.11 中使用 NSBatchDeleteRequest,它提供了巨大的性能提升,但如果你使用类似“全部擦除并创建新”的模式,可能会引起问题,因为它直接作用于持久存储(请参阅 Apple WWDC 2015 视频或幻灯片)

设置

如何使用

创建您的存储

存储是围绕 CoreData PersistentStoreCoordination 和 PersistentStores 的通用包装。您开始的第一步是创建 CoreDataLocalStorage

let store = StoreRef.Named("test1")
let bundle = NSBundle(forClass: self.classForCoder)
let model = ModelRef.Merged([bundle])
let storage = try! CoreDataLocalStorage(store: store!, model: model!, migration: true)

上下文

存储提供对 uiContext(主线程上的 NSManagedObjectContext)的访问以从存储中获取数据)。所有对 CoreData 实体的修改操作都应在存储上的 perform 操作下执行。

获取数据

let cars: [Cars] = try! storage.uiContext.fetch(Request<Car>().filter("mark", equalTo: "Honda"))
let cars: [Cars] = try! storage.uiContext.fetch(Request<Car>())
let cars: [Cars] = try! storage.uiContext.fetch(Request<Car>().sort("model", ascending: true))

let predicate = NSPredicate(format: "model == %@", "CRZ")
let crz: Car? = try! storage.uiContext.fetch(Request<Car>(predicate: predicate)).first

删除/插入/更新操作

所有修改操作应在 perform 操作下执行,因为它内部处理所有核心数据上下文/线程事宜,并且您可以安全地在它们下面使用修改操作。

save 操作在核心数据栈上进行递归保存,并嵌套上下文。因此,如果您更改了已经加载到 uiContext 中的实体,它们将被更新。

注意 perform 函数的第一个参数 ephemeral。如果为 true,将为此操作创建新的上下文,并在保存成功后将其删除。在 CoreData 中创建上下文是一个相当低成本的操作,所以请放心。如果您不需要在短暂上下文中保存数据,请不要调用 save。如果将 ephemeral = false 设置,则将使用预先创建的特别保存上下文来处理所有 ephemeral = false 操作。

do {
  storage.perform(true) { (context, save) throws -> Void in
    // do you unit of work here
    save()
  }
}
catch {
  // There was an error in the operation
}
创建模型

您可以使用 create() 在同一操作中初始化并在上下文中插入。

do {
  storage.perform(true) { (context, save) throws -> Void in
    let newCar: Car = try! context.create()
    newCar.model = "Honda"
    newCar.mark = "CRZ"
    save()
  }
}
catch {
  // There was an error in the operation
}

更新或插入模型

更新或插入(Upsert)- 首先在存储中搜索实体,如果未找到则创建。只需调用 acquire 函数即可。

重要:要使此功能正常工作,您应添加模型属性 pk 并将其设置为该实体的主键字段名称。此外,此属性应已建立索引。这是实现所需性能级别的必需条件。

do {
  storage.perform(true) { (context, save) throws -> Void in
    let car: Car = try! context.acquire("CRZ")
  }
}
catch {
  // There was an error in the operation
}
删除模型

以类似方式,您可以使用上下文中的 remove() 方法来删除数据库中的对象。

do {
  storage.perform(true) { (context, save) throws -> Void in
    let car: Car? = try! context.fetch(Request<Car>.filter("model", equalTo: "CRZ")).first
    if let car = car {
      try! context.remove([car])
      save()
    }
  }
}
catch {
  // There was an error in the operation
}

贡献

支持

如果您想沟通任何问题、建议或做出贡献,请牢记以下流程。

  • 如果您需要帮助,请使用标记为 'datakernel' 的 Stack Overflow 请求您的疑问。
  • 如果您想询问一般问题,也请使用 Stack Overflow。
  • 如果是错误报告或功能请求,请提出一个问题。
  • 如果您想做出贡献,请提交拉取请求,并记住遵循与代码风格、测试等相关规则的规则。

行为准则

本项目遵守开放行为准则。通过参与,您应遵守此准则。

许可证

MIT 许可证 (MIT)

版权所有© <2014>

特此授予任何人免费获得本软件及其相关文档副本(“软件”),在软件上不受限制的处理、包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件的副本,并允许持有软件的人进行上述操作,但受以下条件的约束

上述版权声明和本许可声明应包含在所有副本或软件的主要部分的副本中。

软件按“现状”提供,不提供任何形式,无论是明示的、暗示的还是其他形式的保证,包括但不限于对适销性、针对特定目的的适用性和非侵权的保证。在任何情况下,作者或版权所有者都不应对任何索赔、损害或其他责任承担责任,无论是因为合同、侵权或其他原因产生、源自或与软件或使用或操作软件有关。