Skip to content
John Estropia edited this page Jun 4, 2015 · 9 revisions

CoreStore

Version Platform License

Simple, elegant, and smart Core Data programming with Swift (Swift, iOS 8+)

What CoreStore does better:

  • Heavily supports multiple persistent stores per data stack, just the way .xcdatamodeld files are designed to. CoreStore will also manage one data stack by default, but you can create and manage as many as you need.
  • Ability to plug-in your own logging framework (or any of your favorite 3rd-party logger)
  • Gets around a limitation with other Core Data wrappers where the entity name should be the same as the NSManagedObject subclass name. CoreStore loads entity-to-class mappings from the .xcdatamodeld file, so you are free to name them independently.
  • Provides type-safe, easy to configure observers to replace NSFetchedResultsController and KVO
  • Exposes API not just for fetching, but also for querying aggregates and property values
  • Makes it hard to fall into common concurrency mistakes. All NSManagedObjectContext tasks are encapsulated into safer, higher-level abstractions without sacrificing flexibility and customizability.
  • Provides convenient API for common use cases.
  • Clean API designed around Swift’s code elegance and type safety.

CoreStore's goal is not to expose shorter, magical syntax, but to provide an API that prioritizes readability, consistency, and safety.

TL;DR sample codes

Quick-setup:

CoreStore.addSQLiteStore("MyStore.sqlite")

Simple transactions:

CoreStore.beginAsynchronous { (transaction) -> Void in
    let object = transaction.create(Into(MyEntity))
    object.entityID = 1
    object.name = "test entity"

    transaction.commit { (result) -> Void in
        switch result {
            case .Success(let hasChanges): println("success!")
            case .Failure(let error): println(error)
        }
    }
}

Easy fetching:

let objects = CoreStore.fetchAll(From(MyEntity))
let objects = CoreStore.fetchAll(
    From(MyEntity),
    Where("entityID", isEqualTo: 1),
    OrderBy(.Ascending("entityID"), .Descending("name")),
    Tweak { (fetchRequest) -> Void in
        fetchRequest.includesPendingChanges = true
    }
)

Simple queries:

let count = CoreStore.queryValue(
    From(MyEntity),
    Select<Int>(.Count("entityID"))
)

Contents

TODO

  • Data importing utilities for transactions
  • Migration utilities
  • Support iCloud stores

Installation

  • Requires iOS 8 SDK and above
  • Swift 1.2

Install with Cocoapods

pod 'CoreStore'

This installs CoreStore as a framework. Declare import CoreStore in your swift file to use the library.

Install as Git Submodule

git submodule add https://github.com/JohnEstropia/CoreStore.git <destination directory>

To install as a framework:

Drag and drop CoreStore.xcodeproj to your project.

To include directly in your app module:

Add all .swift files to your project.

Contributions

While CoreStore's design is pretty solid and the unit test and demo app work well, CoreStore is pretty much still in it's early stage. With more exposure to production code usage and criticisms from the developer community, CoreStore hopes to mature as well. Please feel free to report any issues, suggestions, or criticisms! 日本語で連絡していただいても構いません!

License

CoreStore is released under an MIT license. See the LICENSE file for more information

Clone this wiki locally