测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布日期最后发布 | 2016年10月 |
SPM支持 SPM | ✓ |
由 Leroy Jenkins 和 Jelle Vandebeeck 维护。
Duvel 使 Swift 使用 Core Data 友好到前所未有的程度。
Duvel 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile
中:
pod 'Duvel', '~> 1.0'
使用 Duvel
实例初始化 Duvel
的使用。初始化实例时将创建持久存储。
// Create the default store.
let duvel = try! Duvel()
// Create an in memory store.
let duvel = try! Duvel(storeType: NSInMemoryStoreType)
// Create a store with a custom managed object model.
let managedObjectModel = NSManagedObjectModel.mergedModelFromBundles(nil)
let duvel = try! Duvel(managedObjectModel: managedObjectModel)
如果您想将 Duvel
实例化为 sharedInstance
,以便在整个应用程序中使用,而无需在不同类之间传递实例,则可以像这样扩展 Duvel
。
extension Duvel {
static var sharedInstance: Duvel? = {
// Add more configuration to the instance as shown in the above code.
return try? Duvel()
}()
}
// This will encapsulate `Duvel` in an singleton instance.
Duvel.sharedInstance
有三种访问上下文的方式。
// Get the main `NSManagedObjectContext`.
Duvel.sharedInstance.mainContext
// Get the background `NSManagedObjectContext`.
Duvel.sharedInstance.backgroundContext
// Get the `NSManagedObjectContext` for the current thread.
Duvel.sharedInstance.currentContext
对 backgroundContext
的更改在成功后自动合并到 mainContext
中。
您可以在上下文中创建一个 NSManagedObject
。您想要创建的 NSManagedObject
必须遵守 ManagedObjectType
协议。在这种情况下,SomeManagedObject
遵守 ManagedObjectType
。
let context: NSManagedObjectContext = ...
let object = SomeManagedObject.create(in: context)
我们还可以在创建过程中立即设置属性。
let context: NSManagedObjectContext = ...
let object = SomeManagedObject.create(in: context) { innerObject in
innerObject.name = "Leroy"
}
注意! 只有在保存之前,才会将任何内容持久化到存储中。
有删除所有基于给定 NSPredicate
的 NSManagedObject
的可能性。如果没有提供谓词,则删除给定类型的所有对象。
let context: NSManagedObjectContext = ...
// Delete all the objects.
SomeManagedObject.deleteAll(in: context)
// Delete the objects that match a predicate.
let predicate: NSPredicate = ...
SomeManagedObject.deleteAll(in: context, with: predicate)
// Delete one the object.
let object: SomeManagedObject = ...
object.delete(inContext: context)
如果您只想删除单个对象,则可以使用在 Core Data 中定义的。
let context: NSManagedObjectContext = ...
SomeManagedObject.deleteObject(in: context)
注意! 只有在保存之前,才会将任何内容持久化到存储中。
根据属性值查询第一个 NSManagedObject
。
当没有找到与该值相对应的对象时,您可以创建一个新的对象,并将其属性设置为指定的值。当将 createIfNeeded
参数设置为 true 时,将执行此操作。
let context: NSManagedObjectContext = ...
let object = SomeManagedObject.first(in: context, with: "name", value: "Leroy")
let object = SomeManagedObject.first(in: context, with: "name", value: "Leroy", createIfNeeded: true)
您还可以根据给定的谓词搜索找到的第一个 NSManagedObject
。您还可以指定检索结果排序顺序,以便最终获取最后一个对象。
let predicate: NSPredicate = ...
let descriptors: [NSSortDescriptor] = ...
let context: NSManagedObjectContext = ...
let object = SomeManagedObject.first(in: context, with: predicate, sort: descriptors)
获取某个特定类型的所有对象。您可以通过提供 NSPredicate
指定过滤器,并通过提供 NSSortDescriptor
列表来指定排序顺序。
let predicate: NSPredicate = ...
let descriptors: [NSSortDescriptor] = ...
let context: NSManagedObjectContext = ...
let objects = SomeManagedObject.all(in: context, with: predicate, sort: descriptors)
计算对象数量。您可以通过提供 NSPredicate
指定过滤器。
let predicate: NSPredicate = ...
let context: NSManagedObjectContext = ...
let count = SomeManagedObject.count(in: context, with: predicate)
使用上下文中提供的 perform
函数将更改持久保存到存储中。
此函数将应用更改到从初始上下文创建的子上下文中。当这些更改成功应用时,它们将被合并到初始上下文中。
context.perform(changes: { localContext in
// Modify objects inside this closure. At the end of the closure the changes will be
// automatically persisted to the store.
// Make sure you do the changes on the given `localContext`.
}, completion: {
// This completion closure will be called when `Duvel` finished writing to the store.
})
有时您会想更新现有的一个 NSManagedObject
。如果您想这么做并用 perform
函数,那么您可能需要将该对象转换为 localContext
中的一个对象。
let existingObject: SomeManagedObject = ...
context.perform(changes: { localContext in
let localObject = existingObject.to(context: localContext)
localObject.name = "Leroy"
}, completion: {
...
})
以下是我们待办事项列表的概述。
Jelle Vandebeeck,[email protected]
Duvel 在 MIT 许可协议下提供。有关更多信息,请参阅 LICENSE 文件。