测试测试 | ✓ |
Lang语言 | SwiftSwift |
许可 | MIT |
发布最近发布 | 2017年12月 |
SwiftSwift 版本 | 4.0 |
SPM支持 SPM | ✗ |
由 MrDekk 维护。
DataKernel 是围绕 CoreData 栈的简约封装,以简化持久性操作。它主要受到 SugarRecord 的启发,但没有外部依赖(当然除了 Cocoa 外)并进行了一些微调。它涵盖了单元测试。
如果您有任何建议,请提交问题。如果您需要使用示例 - 请参阅单元测试,它非常简单直观。
存储是围绕 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
}
如果您想沟通任何问题、建议或做出贡献,请牢记以下流程。
本项目遵守开放行为准则。通过参与,您应遵守此准则。
MIT 许可证 (MIT)
版权所有© <2014>
特此授予任何人免费获得本软件及其相关文档副本(“软件”),在软件上不受限制的处理、包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件的副本,并允许持有软件的人进行上述操作,但受以下条件的约束
上述版权声明和本许可声明应包含在所有副本或软件的主要部分的副本中。
软件按“现状”提供,不提供任何形式,无论是明示的、暗示的还是其他形式的保证,包括但不限于对适销性、针对特定目的的适用性和非侵权的保证。在任何情况下,作者或版权所有者都不应对任何索赔、损害或其他责任承担责任,无论是因为合同、侵权或其他原因产生、源自或与软件或使用或操作软件有关。