AlecrimCoreData, Swift中,编写了一个强大而简单的核心数据包装框架

分享于 

12分钟阅读

GitHub

  繁體 雙語
A simple Core Data wrapper library written in Swift.
  • 源代码名称:AlecrimCoreData
  • 源代码网址:http://www.github.com/Alecrim/AlecrimCoreData
  • AlecrimCoreData源代码文档
  • AlecrimCoreData源代码下载
  • Git URL:
    git://www.github.com/Alecrim/AlecrimCoreData.git
    Git Clone代码到本地:
    git clone http://www.github.com/Alecrim/AlecrimCoreData
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/Alecrim/AlecrimCoreData
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    AlecrimCoreData

    Language: SwiftPlatformLicense: MITCocoaPodsAppsTwitter

    一个强大而简单的核心数据包装框架,。

    使用框架

    基础

    持久容器

    AlecrimCoreData提供一个默认的类,可以用于 is。扩展或者未使用。 如果使用,它将帮助你完成几个核心数据相关任务。

    ( 提供的PersistentContainer 类可以与以前版本的苹果操作系统过 [iOS 9, for example] 一起使用。)

    如果你愿意,可以将框架与"香草" NSPersistentContainer 一起使用。 在这种情况下,你可以根据需要配置 Core Data Stack,但仅适用于较新的Apple操作系统( iOS 10,例如)。

    // Initializes a `PersistentContainer` instance with default options.let container =PersistentContainer(name: "ModelName")
    通用持久容器

    如果已经对默认管理对象上下文类进行子类化,或者想要更改一些持久容器行为,可以使用 GenericPersistentContainer 类:

    classMyContext: NSManagedObjectContext {
     //.. .}classMyPersistentContainer: GenericPersistentContainer<MyContext> {
     //.. .}

    ( PersistentContainer 类是 GenericPersistentContainer<NSManagedObjectContext> 子类。)

    通用 Table<T> 结构是 AlecrimCoreData 功能的基础,它是有趣的开始。 在本例中,T 是一个 NSManagedObject 子类类型。

    // Extends the `NSManagedObjectContext ` class to include entity table properties.extensionNSManagedObjectContext {
     var people: Table<Person> { return Table<Person>(context: self) }
     var departments: Table<Department> { return Table<Department>(context: self) }
    }
    获取

    假设你有一个名为 PersonNSManagedObject 子类类型,与 Department 相关。 要将所有 Person 实体都作为 array,请使用以下方法:

    for person in context.people {
     print(person.firstName)
    }

    你还可以跳过某些结果:

    let people = context.people.skip(3)

    或者只获取一些结果:

    let people = context.people.skip(3).take(7)

    或者,返回按属性排序的结果:

    let sortedPeople = context.people.orderBy { $0.lastName }

    或者,返回由多个属性排序的结果:

    let sortedPeople = context.people. orderBy { $0.lastName }
    . thenBy { $0.firstName }

    或者,若要返回由多个属性排序的结果,请按升序或者降序:

    let sortedPeople = context.people. orderByDescending { $0.lastName }
    . thenByAscending { $0.firstName }

    如果从数据存储( 例如通过标识符) 中检索单个实体的唯一方法,则可以使用 first 方法:

    iflet person = context.people.first({ $0.identifier==123 }) {
     print(person.name)
    }
    过滤

    你可以使用 filter 方法筛选结果:

    let filteredPeople = context.people.filter { $0.lastName=="Smith" }

    你还可以组合多个过滤器和其他方法:

    let filteredPeople = context.people. filter { $0.lastName=="Smith" }
    . filter { $0.firstName.beginsWith("J") }
    . orderBy { $0.lastName }
    . thenBy { $0.firstName }

    或者:

    let filteredPeople = context.people. filter { $0.lastName=="Smith"&&$0.firstName.beginsWith("J") }
    . orderBy { $0.lastName }
    . thenBy { $0.firstName }
    计数

    你可以使用 count 方法计算持久存储中的实体。

    let peopleCount = context.people.count()

    或者:

    let filteredPeopleCount = context.people.count { $0.lastName=="Smith" }

    或者:

    let filteredPeopleCount = context.people. filter { $0.lastName=="Smith" }
    . count()
    创建。更新。删除和保存数据库,创建和更新实体

    当需要创建实体的新实例时,请使用:

    let person = context.people.create()

    你还可以创建或者获取与条件匹配的第一个现有实体。 如果实体不存在,则创建一个新的,并自动从搜索值指定指定的属性。

    let person = context.people.firstOrCreated { $ 0.identifier==123 }
    删除实体

    要删除单个实体,请执行以下操作:

    iflet person = context.people.first({ $0.identifier==123 }) {
     context.people.delete(person)
    }

    要删除多个实体:

    context.departments.filter({ $0.people.count==0 }).deleteAll()
    保存

    你可以在所有更改完成后保存数据上下文。

    container.performBackgroundTask { context inlet person = context.people.firstOrCreated { $0.identifier==9 }
     person.firstName="Christopher" person.lastName="Eccleston" person.additionalInfo="The best Doctor ever!"do {
     try context.save()
     }
     catch {
     // do a nice error handling here }
    }
    强类型查询属性和 ACDGen

    AlecrimCoreData的另一个重要部分是使用强类型查询属性。 支持强类型查询需要大量样板代码。 考虑到这一点,的ACDGen工具。 只要你需要,就可以将 ACDGen 指向托管对象模型,并自动生成实体的源代码,包括的查询属性。

    使用生成的强类型查询属性是完全可选的,但是与它们一起使用的经验是非常有价值的。 因此,使用强类型查询属性需要一个生成它的扩展的项目是使用生成的模型类。

    ACDGen 源代码是"ACDGen/源"文件夹中的avaible。 这里有一个名为 acdgenp的命令行 工具,可以从同一项目构建。

    如果使用 ACDGen,考虑在Xcode中设置 Manual/None 作为选择选项,以便自动生成实体代码生成。

    高级使用

    好的,你可以编写这样的代码:

    // No data access is made here.let peopleInDepartments = container.viewContext.people. filter { $0.department<< [dept1, dept2] }
    . orderBy { $0.firstName }
    . thenBy { $0.lastName }let itemsPerPage =10for pageNumber in0..<5 {
     print("Page: (pageNumber)")
     // No data access is made here either.let peopleInCurrentPage = peopleInDepartments
    . skip(pageNumber * itemsPerPage)
    . take(itemsPerPage)
     // Now is when the data is read from persistent store.for person in peopleInCurrentPage {
     print("(person.firstName)(person.lastName) - (person.department.name)")
     }
    }

    但是你可以用AlecrimCoreData做更多的事情。 你被邀请读取代码并发现更多可以能性( 并帮助我们改进并创造新的)。

    高级方法

    在后台进行聚合。在后台异步获取以及其他方法。 你可以在 http://cocoadocs.org/docsets/AlecrimCoreData 阅读 AlecrimCoreData 文档,了解更多信息。

    排序和筛选

    你可以使用 AlecrimCoreData查询属性来排序和过滤实体。 在这种情况下,你丢失了强类型属性,但获得了灵活性。 你甚至可以在没有任何问题的情况下混合这两种方法。

    排序

    你可以使用 NSSortDescriptor 实例对实体进行排序:

    let sortDescriptor: NSSortDescriptor =...let orderedPeople = context.people.sort(using: sortDescriptor)

    或者:

    let sd1: NSSortDescriptor =...let sd2: NSSortDescriptor =...let orderedPeople = context.people.sort(using: [sd1, sd2])

    你还可以使用 sortUsingAttributeName:: 方法:

    let orderedPeople = context.people.sort(usingAttributeName: "lastName", ascending: true)
    过滤

    你可以使用 NSPredicate 实例过滤实体:

    let predicate: NSPredicate =...let filteredPeople = context.people.filter(using: predicate)

    使用

    最低要求

    • Swift 3.0
    • Xcode 8.0
    • macOS 10.12 +/ios 9.0 +/tvos 9.0 +/watchOS 2.0 +

    安装

    CocoaPods

    CocoaPods 是 Cocoa 项目的依赖项管理器。 你可以使用以下命令安装它:

    $ gem install cocoapods

    生成 AlecrimCoreData 5.0 + 需要 CocoaPods 1.1.0 +。

    要在你的Xcode项目中使用CocoaPods集成 AlecrimCoreData,请在你的Podfile 中指定它:

    source 'https://github.com/CocoaPods/Specs.git'platform :ios, '10.0'use_frameworks!
    target '<Your Target Name>'do# pod 'AlecrimCoreData', :git => 'https://github.com/Alecrim/AlecrimCoreData.git', :branch => 'develop' pod 'AlecrimCoreData', '~> 5.0'end

    然后,运行以下命令:

    $ pod install
    手动

    你可以添加AlecrimCoreData作为一个git子模块,将 AlecrimCoreData.xcodeproj 文件拖到你的in项目中,并将框架产品添加到应用。

    联系人

    许可证

    AlecrimCoreData 在MIT许可证下发布。 有关更多信息,请参阅许可证。


    数据    framework  WRAP  换行  POW  
    相关文章