使用 Swift 编写的 Core Data 扩展。
请确保所有托管对象都实现了协议 'NamedManageObject' 并返回其实体名称。
您还可以使用 mogenerator 来生成此行为(非常好的工具,感谢创建者!)如果使用 mogenerator,您需要添加一个实现 'ManagedObjectEntity' 协议的基本类,或者使用我的 分叉,它允许您将协议参数和框架包含到 Swift 模板中
mogenerator --base-class-import "THCCoreData" \
--protocol "ManagedObjectEntity" \
...
获取默认管理器。它将在文档文件夹中创建一个 sqlite 存储并在主 bundle 中合并所有对象模型文件。
let manager = ContextManager()
let mainContext = manager.mainContext
另外,您也可以通过传递 managedObjectModel(sqlite 存储仍然为您创建)初始化一个自定义的上下文管理器...
let manager = let manager = ContextManager(managedObjectModel: customModel)
... 或者通过提供完整的持久化存储协调器
let manager = ContextManager(persistentStoreCoordinator: customCoordinator)
当使用 sqlite 自动创建初始化器时,您可以将 'recreateStoreIfNeeded' 设置为 true,这将在出现错误时尝试重新创建 sqlite 存储首先删除存储。这只应在开发期间使用,因为它可能导致数据丢失!
let manager = ContextManager(recreateStoreIfNeeded: true)
如果您想使用单例管理器,您可以轻松创建自己的 ContextManager 扩展
public extension ContextManager {
static let defaultManager: ContextManager = {
return ContextManager()
}()
}
如果您需要一个新私有上下文,您可以从管理器中获取它
let privateContext = manager.privateContext
此库扩展了默认的 NSManagedObjectContext 类。假设我们从实体生成了一个托管对象子类 'MyObject',现在您可以将它像这样插入到上下文中
let context = ContextManager.defaultManager.mainContext
let myObject = context.createObject(MyObject)
您还可以获取给定托管对象子类的默认 NSFetchRequest
let fetchRequest = context.fetchRequest(MyObject)
最后但同样重要的是,您还可以从上下文中获取一个 RequestSet 类(请参阅 RequestSet)
let requestSet = context.requestSet(MyObject)
此类受到了 django 框架(Python)的启发(QuerySet)。它有助于创建 NSFetchRequest 并让您轻松创建查询请求。它将聚合请求设置,并在访问数据时才执行查询。
let requestSet = RequestSet<MyManagedObject>(context: manager.mainContext)
// get the current count (this wont yet execute the fetch)
let count = requestSet.count
// iterate over result set
for obj in requestSet {
println(obj.name)
}
// access elements directly
println(requestSet[0])
// filter with predicate
requestSet.filter(NSPredicate(format:"name='test'"))
// filter with value
requestSet.filter("name", value:"test")
// filter with tuples (default AND)
requestSet.filter([("name", "test"), ("name", "test2")])
// OR filter with tuples
requestSet.filter([("name", "test"), ("name", "test2")], mode: RequestFilterMode.OR)
// chaining filters ...
requestSet.filter(NSPredicate(format:"name='test'"))
.filter(NSPredicate(format:"name='test2'"))
// ... with OR
requestSet.filter(NSPredicate(format:"name='test'"))
.filter(NSPredicate(format:"name='test2'"), mode: RequestFilterMode.OR)
// mixing filters (will create name='test' OR name='test2' AND name='test3')
requestSet.filter([("name", "test"), ("name", "test2")], mode: RequestFilterMode.OR)
.filter("name", value: "test3")
// and so on ...
// will limit the request set to then
requestSet.limit(3)
// sort by 'name' (default ascending)
requestSet.sortBy("name")
// sort desecending
requestSet.sortBy("name", order:RequestSortOrder.DESCENDING)
// multiple sortings (will sort first the attribute 'name' and secondary the attribute 'otherAttribute')
requestSet.sortBy([
("name", RequestSortOrder.DESCENDING),
("otherAttrinute",RequestSortOrder.ASCENDING)]
)
由于链式调用,可以生成以下获取请求
// will filter all entries with name='test' or firstname='test' sorted by name
// with descending order and limit the result to three
requestSet.filter("name", value:"test")
.filter("firstname", value:"test", mode: RequestFilterMode.OR)
.sortBy("name", order: RequestSortOrder.DESCENDING)
.limit(3)