iOS 9、10 CoreData:无法在路径加载优化模型
iOS 9, 10 CoreData: Failed to load optimized model at path
我创建了新版本的 CoreData 模型并将现有模型迁移到其中。应用程序在 iOS 9+ 上没有任何问题,但对于 iOS 9 和 10,我收到此错误:
2017-10-22 19:28:37.081 CafeManager[16654:1918728] CoreData: Failed to
load optimized model at path
'/Users/dj-glock/Library/Developer/CoreSimulator/Devices/A81AA9C4-7B59-4422-BA0A-0FD0D1A05205/data/Containers/Bundle/Application/DD66571C-4EB6-4A8B-A99B-B447DD0FFFBA/CafeManager.app/CafeManager.momd/CafeManager
v2.omo'
iOS 10:
CoreData: annotation: Failed to load optimized model at path
'/Users/dj-glock/Library/Developer/CoreSimulator/Devices/3708F142-3BD0-4C70-8515-217B7785D285/data/Containers/Bundle/Application/3842402F-BEAE-47CB-8C27-EC6CA7D76B03/CafeManager.app/CafeManager.momd/CafeManager
v2.omo'
我已经检查了很多类似的问题,但没有找到适合我的解决方案。我试图在模拟器上重新安装应用程序,重新启动等等。有人可以建议吗?
文件夹包含以下文件:
iOS9 的 AppDelegate CoreData 堆栈:
// MARK: - Core Data stack for iOS 8+
static var managedObjectContext: NSManagedObjectContext = {
var applicationDocumentsDirectory: URL = {
let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return urls[urls.count-1]
}()
var managedObjectModel: NSManagedObjectModel = {
let modelURL = Bundle.main.url(forResource: "CafeManager", withExtension: "momd")!
return NSManagedObjectModel(contentsOf: modelURL)!
}()
var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
let a = managedObjectModel.entities
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
let url = applicationDocumentsDirectory.appendingPathComponent("SingleViewCoreData.sqlite")
print(url)
do
{
let options = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true]
try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: options)
} catch {
NSLog("Error initializing smStore for iOS 8+ - \(error.localizedDescription)")
}
return coordinator
}()
let coordinator = persistentStoreCoordinator
var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
可能与 this question 重复。
这似乎是 < iOS 11 上优化模型版本的问题。只需使用未优化的 .mom 模型版本代替 (CafeManager v2.mom
)。
这是我修复它的方法:
public func managedObjectModel() -> NSManagedObjectModel {
let omoURL = modelBundle.url(forResource: name, withExtension: "omo", subdirectory: modelDirectoryName)
let momURL = modelBundle.url(forResource: name, withExtension: "mom", subdirectory: modelDirectoryName)
guard var url = omoURL ?? momURL else { fatalError("model version \(self) not found") }
// Use unoptimized model version < iOS 11
if #available(iOS 11, *) {} else { if let momURL = momURL { url = momURL} }
guard let model = NSManagedObjectModel(contentsOf: url) else { fatalError("cannot open model at \(url)") }
return model
}
如果您在想,我想要我的速度,我为什么要使用未优化的东西,请阅读 this 答案。
我创建了新版本的 CoreData 模型并将现有模型迁移到其中。应用程序在 iOS 9+ 上没有任何问题,但对于 iOS 9 和 10,我收到此错误:
2017-10-22 19:28:37.081 CafeManager[16654:1918728] CoreData: Failed to load optimized model at path '/Users/dj-glock/Library/Developer/CoreSimulator/Devices/A81AA9C4-7B59-4422-BA0A-0FD0D1A05205/data/Containers/Bundle/Application/DD66571C-4EB6-4A8B-A99B-B447DD0FFFBA/CafeManager.app/CafeManager.momd/CafeManager v2.omo'
iOS 10:
CoreData: annotation: Failed to load optimized model at path '/Users/dj-glock/Library/Developer/CoreSimulator/Devices/3708F142-3BD0-4C70-8515-217B7785D285/data/Containers/Bundle/Application/3842402F-BEAE-47CB-8C27-EC6CA7D76B03/CafeManager.app/CafeManager.momd/CafeManager v2.omo'
我已经检查了很多类似的问题,但没有找到适合我的解决方案。我试图在模拟器上重新安装应用程序,重新启动等等。有人可以建议吗?
文件夹包含以下文件:
iOS9 的 AppDelegate CoreData 堆栈:
// MARK: - Core Data stack for iOS 8+
static var managedObjectContext: NSManagedObjectContext = {
var applicationDocumentsDirectory: URL = {
let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return urls[urls.count-1]
}()
var managedObjectModel: NSManagedObjectModel = {
let modelURL = Bundle.main.url(forResource: "CafeManager", withExtension: "momd")!
return NSManagedObjectModel(contentsOf: modelURL)!
}()
var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
let a = managedObjectModel.entities
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
let url = applicationDocumentsDirectory.appendingPathComponent("SingleViewCoreData.sqlite")
print(url)
do
{
let options = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true]
try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: options)
} catch {
NSLog("Error initializing smStore for iOS 8+ - \(error.localizedDescription)")
}
return coordinator
}()
let coordinator = persistentStoreCoordinator
var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
可能与 this question 重复。
这似乎是 < iOS 11 上优化模型版本的问题。只需使用未优化的 .mom 模型版本代替 (CafeManager v2.mom
)。
这是我修复它的方法:
public func managedObjectModel() -> NSManagedObjectModel {
let omoURL = modelBundle.url(forResource: name, withExtension: "omo", subdirectory: modelDirectoryName)
let momURL = modelBundle.url(forResource: name, withExtension: "mom", subdirectory: modelDirectoryName)
guard var url = omoURL ?? momURL else { fatalError("model version \(self) not found") }
// Use unoptimized model version < iOS 11
if #available(iOS 11, *) {} else { if let momURL = momURL { url = momURL} }
guard let model = NSManagedObjectModel(contentsOf: url) else { fatalError("cannot open model at \(url)") }
return model
}
如果您在想,我想要我的速度,我为什么要使用未优化的东西,请阅读 this 答案。