NSUnderlyingException ="不能两次添加同一商店"迁移核心数据时

时间:2017-08-07 13:58:55

标签: ios sqlite core-data swift3

我正在使用以下代码设置我的应用持久性容器:

lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "App_Name")

    let myFileManager = FileManager()

    do {
        let docsurl = try myFileManager.url(for:.applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: false)

        let myUrl = docsurl.appendingPathComponent("App_Name")

        let description = NSPersistentStoreDescription(url: myUrl)
        container.persistentStoreDescriptions = [description]

        let options = [NSInferMappingModelAutomaticallyOption : true,
                        NSMigratePersistentStoresAutomaticallyOption : true]

        try container.persistentStoreCoordinator.addPersistentStore(ofType: NSInMemoryStoreType, configurationName: nil, at: myUrl, options: options)

    } catch {
        fatalErrorText = error.localizedDescription
        print(fatalErrorText)
    }

    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            fatalErrorText = error.debugDescription
            print(fatalErrorText)
        }
    })
    return container
}()

但是,当我尝试访问核心数据时,会出现以下错误:

  

2017-08-07 14:43:57.391529 + 0100 App Name [98764:1854740] [error]错误:-addPersistentStoreWithType:SQLite配置:(null)URL:file:/// Users / Seb / Library / Developer /CoreSimulator /Devices/241E1A36-631B-4071-8357-5F551F32403F/data/Containers/Data/Application/BC35D1CD-FA17-4F1F-99A0-EB0E73A42F3C/Library/Application%20Support/App_Name.sqlite options:{       NSInferMappingModelAutomaticallyOption = 1;       NSMigratePersistentStoresAutomaticallyOption = 1;   } ...返回错误错误域= NSCocoaErrorDomain代码= 134080"(null)" UserInfo = {NSUnderlyingException =无法将同一商店添加两次}与userInfo字典{       NSUnderlyingException ="不能两次添加同一商店&#34 ;;   }   CoreData:错误:-addPersistentStoreWithType:SQLite配置:(null)URL:file:/// Users / Seb / Library / Developer / CoreSimulator / Devices / 241E1A36-631B-4071-8357-5F551F32403F / data / Containers / Data / Application / BC35D1CD-FA17-4F1F-99A0-EB0E73A42F3C / Library / Application%20Support / App_Name.sqlite options:{       NSInferMappingModelAutomaticallyOption = 1;       NSMigratePersistentStoresAutomaticallyOption = 1;   } ...返回错误错误Domain = NSCocoaErrorDomain Code = 134080"(null)" UserInfo = {NSUnderlyingException = 不能将同一商店添加两次}与userInfo字典{       NSUnderlyingException =" 无法两次添加同一商店&#34 ;;   }

我启用了iCloud,确实找到了一个声称问题出在iCloud上的答案,但他们的解决方案并不适用于我。

我已经在这里找到了其他一些解决这个问题的方法,但是我们无法解读/翻译答案。

1 个答案:

答案 0 :(得分:1)

NSPersistentContainer是核心数据堆栈所需的全部包装器。它将使用带有单个sql存储的persistentStoreCoordinator设置创建一个managedObjectContext。简化为找到你给它的名称的模型,并命名具有相同名称的sql文件。默认情况下会为NSPersistentContainer启用自动迁移。

如果您需要更多自定义设置,您可以自己创建所有实体(这并不难)。或者,您可以在致电persistentStoreDescriptions之前设置loadPersistentStores媒体资源。使用persistentStoreDescription,您可以设置URL以保存sql文件,并设置shouldMigrateStoreAutomatically。  通常没有理由在默认情况下将其设置为true,请参阅https://developer.apple.com/documentation/coredata/nspersistentstoredescription/1640566-shouldmigratestoreautomatically

TL; DR 摆脱了do catch中的所有内容,loadPersistentStores的默认行为将起作用