THCCoreData 0.0.1

THCCoreData 0.0.1

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布最新发布2016年11月
SPM支持 SPM

Chris Weber 维护。



  • Weber Christopher

Thinc CoreData

使用 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

NSManagedContext

此库扩展了默认的 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)

RequestSet

此类受到了 django 框架(Python)的启发(QuerySet)。它有助于创建 NSFetchRequest 并让您轻松创建查询请求。它将聚合请求设置,并在访问数据时才执行查询。

init request set

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)