【发布时间】:2020-05-09 22:30:03
【问题描述】:
我设置了一个 DatabaseApplicationService
- 获取以编程方式定义的 NSManagedObjectModel
- 基于此模型创建一个 NSPersistentCloudKitContainer,具有“本地”和“云”两个配置。
看起来一切正常。
lazy var persistentContainer: NSPersistentCloudKitContainer = {
// Ensure that we have the required path.
pathHandler.ensurePersistentStorePath()
#if DEBUG
// get the store description
guard let description = container.persistentStoreDescriptions.first
else {
fatalError("Could not retrieve a persistent store description.")
}
// initialize the CloudKit schema
try? container.initializeCloudKitSchema(options: NSPersistentCloudKitContainerSchemaInitializationOptions.dryRun)
#endif
let local = NSPersistentStoreDescription(url: pathHandler.persistentLocalStoreURL)
local.configuration = "Local"
let cloud = NSPersistentStoreDescription(url: pathHandler.persistentCloudStoreURL)
cloud.configuration = "Cloud"
cloud.cloudKitContainerOptions = NSPersistentCloudKitContainerOptions(containerIdentifier: "iCloud.com.innoreq.HappyFreelancer")
container.persistentStoreDescriptions = [ local, cloud ]
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)")
}
})
return container
}()
在SceneDelegate中,环境获取了注入的NSManagedObjectContext:
let contentView = ContentView().environment(\.managedObjectContext, databaseService.context)
在视图的模型中,环境被要求提供上下文:
@Environment(\.managedObjectContext) var managedObjectContext: NSManagedObjectContext
现在,从上下文中获取数据时:
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "EWork")
do {
return try managedObjectContext.execute(fetchRequest) as! [IsTimedAndTagged]
} catch {
fatalError("Failed to fetch EWork")
}
这个错误在运行时抛出:
2020-01-23 16:34:05.981483+0100 XY[14121:20859222] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSPersistentStoreCoordinator for searching for entity name 'EWork''
检查服务的协调器时,它不是 nil。这种奇怪的效果有什么解释吗?
【问题讨论】:
-
你的意思是
managedObjectContext.fetch(fetchRequest)而不是execute? -
改变了,现在有同样的最终错误,但之前有一个警告:
view context accessed for persistent container XY with no stores loaded -
对以下代码有同样的问题:NSEntityDescription.entity(forEntityName: "Category", in: context) in SwiftUI
-
你能解决这个问题吗?