Skip to content

Instantly share code, notes, and snippets.

@calebhicks
Last active June 22, 2018 16:29
Show Gist options
  • Save calebhicks/404165bdb6bc77502026 to your computer and use it in GitHub Desktop.
Save calebhicks/404165bdb6bc77502026 to your computer and use it in GitHub Desktop.
A simple Core Data written in Swift. Inspired by the fantastic Core Data book by Florian Kugler and Daniel Eggert at https://www.objc.io/books/core-data/
//
// Stack.swift
//
import Foundation
import CoreData
class Stack {
static let sharedStack = Stack()
lazy var managedObjectContext: NSManagedObjectContext = Stack.setUpMainContext()
static func setUpMainContext() -> NSManagedObjectContext {
let bundle = NSBundle.mainBundle()
guard let model = NSManagedObjectModel.mergedModelFromBundles([bundle])
else { fatalError("model not found") }
let psc = NSPersistentStoreCoordinator(managedObjectModel: model)
try! psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil,
URL: storeURL(), options: [NSMigratePersistentStoresAutomaticallyOption: true,
NSInferMappingModelAutomaticallyOption: true])
let context = NSManagedObjectContext(
concurrencyType: .MainQueueConcurrencyType)
context.persistentStoreCoordinator = psc
return context
}
static func storeURL () -> NSURL? {
let documentsDirectory: NSURL? = try? NSFileManager.defaultManager().URLForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomain: NSSearchPathDomainMask.UserDomainMask, appropriateForURL: nil, create: true)
return documentsDirectory?.URLByAppendingPathComponent("db.sqlite")
}
}
@MikeDCastillo
Copy link

Needs a swift 3 update!

@trm36
Copy link

trm36 commented Jan 20, 2017

###Using NSpersistentContainer

//
//  Stack.swift
//

import Foundation
import CoreData

enum CoreDataStack {
	
	static let container: NSPersistentContainer = {
		
		let container = NSPersistentContainer(name: "Journal")
		container.loadPersistentStores() { (storeDescription, error) in
			if let error = error as NSError? {
				fatalError("Unresolved error \(error), \(error.userInfo)")
			}
		}
		return container
	}()
	
	static var context: NSManagedObjectContext { return container.viewContext }
}

Pre-iOS 10 - Swift 3.0 Update

class Stack {
    
    static let sharedStack = Stack()
    
    lazy var managedObjectContext: NSManagedObjectContext = Stack.setUpMainContext()
    
    static func setUpMainContext() -> NSManagedObjectContext {
        let bundle = Bundle.main
        
        guard let model = NSManagedObjectModel.mergedModel(from: [bundle]) else { fatalError("model not found") }
        let psc = NSPersistentStoreCoordinator(managedObjectModel: model)
        

        try! psc.addPersistentStore(ofType: NSSQLiteStoreType,
                                    configurationName: nil,
                                    at: storeURL(),
                                    options: [NSMigratePersistentStoresAutomaticallyOption : true,
                                              NSInferMappingModelAutomaticallyOption: true])
        
        
        let context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
        context.persistentStoreCoordinator = psc

        return context
    }
    
    static func storeURL () -> URL? {
        
        let documentsDirectory: URL? = try? FileManager.default.url(for: FileManager.SearchPathDirectory.documentDirectory, in: FileManager.SearchPathDomainMask.userDomainMask, appropriateFor: nil, create: true)
        
        return documentsDirectory?.appendingPathComponent("db.sqlite")
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment