Last active
July 11, 2016 14:20
-
-
Save danielgarbien/89a6330dfaaf57e07a4641034784e176 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
import CoreData | |
class CoreDataStack { | |
let mainContext: NSManagedObjectContext | |
private let persistentStoreCoordinator: NSPersistentStoreCoordinator | |
private let managedObjectModel: NSManagedObjectModel | |
init(managedObjectModelName: String, storeType: String = NSSQLiteStoreType, configuration: String? = nil, URL storeURL: NSURL? = NSFileManager.defaultManager().defaultStoreURL(), options: [NSObject : AnyObject]? = nil) { | |
managedObjectModel = NSManagedObjectModel(managedObjectModelName: managedObjectModelName)! | |
persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel, storeType: storeType, configuration: configuration, URL: storeURL, options: options) | |
mainContext = NSManagedObjectContext(storeCoordinator: persistentStoreCoordinator) | |
} | |
} | |
extension NSFileManager { | |
func defaultStoreURL() -> NSURL { | |
let libraryDir = try! URLForDirectory(.LibraryDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true) | |
return libraryDir.URLByAppendingPathComponent("table") | |
} | |
} | |
private extension NSManagedObjectModel { | |
convenience init?(managedObjectModelName: String) { | |
guard let modelURL = NSBundle.mainBundle().URLForResource(managedObjectModelName, withExtension: "momd") else { | |
return nil | |
} | |
self.init(contentsOfURL: modelURL) | |
} | |
} | |
private extension NSManagedObjectContext { | |
convenience init(storeCoordinator: NSPersistentStoreCoordinator, concurrencyType: NSManagedObjectContextConcurrencyType = .MainQueueConcurrencyType) { | |
self.init(concurrencyType: concurrencyType) | |
persistentStoreCoordinator = storeCoordinator | |
} | |
} | |
private extension NSPersistentStoreCoordinator { | |
convenience init(managedObjectModel: NSManagedObjectModel, storeType: String, configuration: String?, URL storeURL: NSURL?, options: [NSObject : AnyObject]?) { | |
self.init(managedObjectModel: managedObjectModel) | |
addOrReplacePersistentStoreWithType(storeType, configuration: configuration, URL: storeURL, options: options) | |
} | |
func addOrReplacePersistentStoreWithType(storeType: String, configuration: String?, URL storeURL: NSURL?, options: [NSObject : AnyObject]?) { | |
do { | |
try addPersistentStoreWithType(storeType, configuration: configuration, URL: storeURL, options: options) | |
} | |
catch let error as NSError where error.domain == NSCocoaErrorDomain && error.code == NSPersistentStoreIncompatibleVersionHashError { | |
// TODO migrate | |
try! removePersistentStoreAtURL(storeURL!, type: storeType, options: options) | |
return addOrReplacePersistentStoreWithType(storeType, configuration: configuration, URL: storeURL, options: options) | |
} | |
catch { | |
fatalError(String(error)) | |
} | |
} | |
func removePersistentStoreAtURL(url: NSURL, type: String, options : [NSObject : AnyObject]?) throws { | |
try destroyPersistentStoreAtURL(url, withType:type, options:options) | |
try NSFileManager.defaultManager().removeItemAtURL(url) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment