我正在使用以下代码设置我的应用持久性容器:
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上的答案,但他们的解决方案并不适用于我。
我已经在这里找到了其他一些解决这个问题的方法,但是我们无法解读/翻译答案。
答案 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
的默认行为将起作用