// // EncounterDB.swift // CovidSafe // // Copyright © 2020 Australian Government. All rights reserved. // import UIKit import CoreData class EncounterDB { static let shared = EncounterDB() private let modelName = "tracer" private var localStoreUrl: URL? private var _persistentContainer: CovidPersistentContainer? var migrationDelegate: EncounterDBMigrationProgress? var backgroundTask: UIBackgroundTaskIdentifier = .invalid private lazy var managedObjectModel: NSManagedObjectModel = { guard let modelURL = Bundle.main.url(forResource: self.modelName, withExtension: "momd") else { fatalError("Unable to Find Data Model") } guard let managedObjectModel = NSManagedObjectModel(contentsOf: modelURL) else { fatalError("Unable to Load Data Model") } return managedObjectModel }() public var persistentContainer: CovidPersistentContainer? { get { if let container = _persistentContainer { return container } //check if we need to migrate store first if let localStoreUrl = self.localStoreUrl { if FileManager.default.fileExists(atPath: localStoreUrl.path) && store(localStoreUrl, isCompatibleWithModel: self.managedObjectModel) == false { return nil // Don't return a store if it's not compatible with the model } } let container = CovidPersistentContainer(name: self.modelName) container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { fatalError("Unresolved error \(error), \(error.userInfo)") } }) _persistentContainer = container return _persistentContainer } } func registerBackgroundTask() { backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in self?.endBackgroundTask() } assert(backgroundTask != .invalid) } func endBackgroundTask() { if(backgroundTask != .invalid){ UIApplication.shared.endBackgroundTask(backgroundTask) backgroundTask = .invalid } } func setup(migrationDelegate: EncounterDBMigrationProgress?) { self.migrationDelegate = migrationDelegate self.localStoreUrl = CovidPersistentContainer.defaultDirectoryURL().appendingPathComponent(self.modelName, isDirectory: true).appendingPathExtension("sqlite") migrateStoreIfNecessary(storeURL: self.localStoreUrl!, destinationModel: self.managedObjectModel) } }