Core data Swift 3从appDelegate中的SQL文件预加载

Core data Swift 3从appDelegate中的SQL文件预加载,core-data,swift3,ios10,Core Data,Swift3,Ios10,我正在尝试快速转换3。我在swift 2项目中预加载sql文件中的数据。我不确定如何在swift 3.0中实现此功能?下面是我的swift 2 appDelegate文件。在swift 3中,核心数据堆栈已经发生了足够多的变化,我不知道在哪里尝试重用在swift 2中为我工作的相同代码。我使用的代码在注释“AddedforSQLite预加载”下列出。多谢各位 // MARK: - Core Data stack lazy var applicationDocumentsDirector

我正在尝试快速转换3。我在swift 2项目中预加载sql文件中的数据。我不确定如何在swift 3.0中实现此功能?下面是我的swift 2 appDelegate文件。在swift 3中,核心数据堆栈已经发生了足够多的变化,我不知道在哪里尝试重用在swift 2中为我工作的相同代码。我使用的代码在注释“AddedforSQLite预加载”下列出。多谢各位

    // MARK: - Core Data stack

lazy var applicationDocumentsDirectory: URL = {
    // The directory the application uses to store the Core Data store file. This code uses a directory named "self.edu.SomeJunk" in the application's documents Application Support directory.
    let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    return urls[urls.count-1]
}()

lazy var managedObjectModel: NSManagedObjectModel = {
    // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
    let modelURL = Bundle.main.url(forResource: "ESLdata", withExtension: "momd")!
    return NSManagedObjectModel(contentsOf: modelURL)!
}()

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
    // Create the coordinator and store
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)

    let url = self.applicationDocumentsDirectory.appendingPathComponent("ESLdata.sqlite")



    //ADDED FOR SQLITE PRELOAD
    // Load the existing database
    if !FileManager.default.fileExists(atPath: url.path) {
        let sourceSqliteURLs = [Bundle.main.url(forResource: "ESLdata", withExtension: "sqlite")!,Bundle.main.url(forResource: "ESLdata", withExtension: "sqlite-wal")!, Bundle.main.url(forResource: "ESLdata", withExtension: "sqlite-shm")!]
        let destSqliteURLs = [self.applicationDocumentsDirectory.appendingPathComponent("ESLdata.sqlite"), self.applicationDocumentsDirectory.appendingPathComponent("ESLdata.sqlite-wal"), self.applicationDocumentsDirectory.appendingPathComponent("ESLdata.sqlite-shm")]
        for index in 0 ..< sourceSqliteURLs.count {
            do {
                try FileManager.default.copyItem(at: sourceSqliteURLs[index], to: destSqliteURLs[index])
            } catch {
                print(error)
            }
        }
    }
    // END OF ADDED CODE



    var failureReason = "There was an error creating or loading the application's saved data."
    do {
        try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options:  [NSMigratePersistentStoresAutomaticallyOption:true, NSInferMappingModelAutomaticallyOption:true])
    } catch {
        // Report any error we got.
        var dict = [String: AnyObject]()
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" as AnyObject?
        dict[NSLocalizedFailureReasonErrorKey] = failureReason as AnyObject?

        dict[NSUnderlyingErrorKey] = error as NSError
        let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
        // Replace this with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
        abort()
    }

    return coordinator
}()

lazy var managedObjectContext: NSManagedObjectContext = {
    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
    let coordinator = self.persistentStoreCoordinator
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    managedObjectContext.persistentStoreCoordinator = coordinator
    return managedObjectContext
}()

// MARK: - Core Data Saving support

func saveContext () {
    if managedObjectContext.hasChanges {
        do {
            try managedObjectContext.save()
            print("SAVED")
        } catch {
            print("Save Failed")

            let nserror = error as NSError
            NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
            abort()
        }
    }
}
//标记:-核心数据堆栈
lazy var applicationdocuments目录:URL={
//应用程序用于存储核心数据存储文件的目录。此代码在应用程序的文档应用程序支持目录中使用名为“self.edu.SomeJunk”的目录。
让URL=FileManager.default.URL(对于:.documentDirectory,在:.userDomainMask中)
返回URL[url.count-1]
}()
惰性变量managedObjectModel:NSManagedObjectModel={
//应用程序的托管对象模型。此属性不是可选的。应用程序无法找到并加载其模型是一个致命错误。
让modelURL=Bundle.main.url(用于资源:“ESLdata”,扩展名为“momd”)!
返回NSManagedObjectModel(contentsOf:modelURL)!
}()
lazy var persistentStoreCoordinator:NSPersistentStoreCoordinator={
//应用程序的持久存储协调器。此实现创建并返回一个协调器,并将应用程序的存储添加到该协调器中。此属性是可选的,因为存在可能导致存储创建失败的合法错误条件。
//创建协调器和存储
let coordinator=NSPersistentStoreCoordinator(managedObjectModel:self.managedObjectModel)
让url=self.applicationDocumentsDirectory.appendingPathComponent(“ESLdata.sqlite”)
//添加了SQLITE预加载
//加载现有数据库
如果!FileManager.default.fileExists(atPath:url.path){
让sourceSqliteURLs=[Bundle.main.url(对于资源:“ESLdata”,带扩展名:“sqlite”)!,Bundle.main.url(对于资源:“ESLdata”,带扩展名:“sqlite-shm”)!,Bundle.main.url(对于资源:“ESLdata”,带扩展名:“sqlite-shm”)!]
设destSqliteURLs=[self.applicationDocumentsDirectory.appendingPathComponent(“ESLdata.sqlite”)、self.applicationDocumentsDirectory.appendingPathComponent(“ESLdata.sqlite wal”)、self.applicationDocumentsDirectory.appendingPathComponent(“ESLdata.sqlite shm”)]
对于0中的索引。
以下是我试图将代码更新到的内容,但没有成功:

func getDocumentsDirectory()-> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let documentsDirectory = paths[0]
    return documentsDirectory
}

// MARK: - Core Data stack

lazy var persistentContainer: NSPersistentContainer = {
    /*
     The persistent container for the application. This implementation
     creates and returns a container, having loaded the store for the
     application to it. This property is optional since there are legitimate
     error conditions that could cause the creation of the store to fail.
     */





    let container = NSPersistentContainer(name: "ESLdata")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.

            /*
             Typical reasons for an error here include:
             * The parent directory does not exist, cannot be created, or disallows writing.
             * The persistent store is not accessible, due to permissions or data protection when the device is locked.
             * The device is out of space.
             * The store could not be migrated to the current model version.
             Check the error message to determine what the actual problem was.
             */
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
        //ADDED FOR SQLITE PRELOAD

        let url = self.getDocumentsDirectory().appendingPathComponent("ESLdata.sqlite")
        // Load the existing database

        if !FileManager.default.fileExists(atPath: url.path) {
            let sourceSqliteURLs = [Bundle.main.url(forResource: "ESLdata", withExtension: "sqlite")!,Bundle.main.url(forResource: "ESLdata", withExtension: "sqlite-wal")!, Bundle.main.url(forResource: "ESLdata", withExtension: "sqlite-shm")!]
            let destSqliteURLs = [self.getDocumentsDirectory().appendingPathComponent("ESLdata.sqlite"), self.getDocumentsDirectory().appendingPathComponent("ESLdata.sqlite-wal"), self.getDocumentsDirectory().appendingPathComponent("ESLdata.sqlite-shm")]
            for index in 0 ..< sourceSqliteURLs.count {
                do {
                    try FileManager.default.copyItem(at: sourceSqliteURLs[index], to: destSqliteURLs[index])
                } catch {
                    print(error)
                }
            }
        }
        // END OF ADDED CODE


    })
    return container
}()

// MARK: - Core Data Saving support

func saveContext () {
    let context = persistentContainer.viewContext
    if context.hasChanges {
        do {
            try context.save()
        } catch {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            let nserror = error as NSError
            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
        }
    }
}
func getDocumentsDirectory()->URL{
让路径=FileManager.default.url(对于:.documentDirectory,在:.userDomainMask中)
让documentsDirectory=路径[0]
返回文档目录
}
//标记:-核心数据堆栈
lazy var persistentContainer:NSPersistentContainer={
/*
应用程序的持久容器。此实现
创建并返回一个容器,该容器已加载
此属性是可选的,因为存在合法的
可能导致存储创建失败的错误条件。
*/
let container=NSPersistentContainer(名称:“ESLdata”)
中的container.loadPersistentStores(completionHandler:{(storeDescription,错误)
如果let error=错误为N错误{
//将此实现替换为适当处理错误的代码。
//fatalError()导致应用程序生成崩溃日志并终止。您不应在装运应用程序中使用此函数,尽管它在开发过程中可能很有用。
/*
典型的
func getDocumentsDirectory()-> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let documentsDirectory = paths[0]
    return documentsDirectory
}

// MARK: - Core Data stack

lazy var persistentContainer: NSPersistentContainer = {

    let container = NSPersistentContainer(name: "ESLdata")

    let appName: String = "ESLdata"
    var persistentStoreDescriptions: NSPersistentStoreDescription

    let storeUrl = self.getDocumentsDirectory().appendingPathComponent("ESLData.sqlite")

    if !FileManager.default.fileExists(atPath: (storeUrl.path)) {
        let seededDataUrl = Bundle.main.url(forResource: appName, withExtension: "sqlite")
        try! FileManager.default.copyItem(at: seededDataUrl!, to: storeUrl)
    }

    let description = NSPersistentStoreDescription()
    description.shouldInferMappingModelAutomatically = true
    description.shouldMigrateStoreAutomatically = true
    description.url = storeUrl

    container.persistentStoreDescriptions = [description]

    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {

            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()