如何解决Core Data错误:尝试在今日应用扩展程序小部件中访问Core Data容器时,尝试在路径中添加只读文件?

时间:2017-05-10 16:11:58

标签: ios core-data ios10

我正在尝试使用今天扩展小部件中的Core Data访问数据库。

创建Core Data容器的函数是:

func createContainer(completion: @escaping (NSPersistentContainer) -> ()) {
    let applicationGroupIdentifier = "group.com.name.exampleApp.sharedContainer"

    guard let newURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: applicationGroupIdentifier)
        else { fatalError("Could not create persistent store URL") }

    let persistentStoreDescription = NSPersistentStoreDescription()

    persistentStoreDescription.url = newURL

    let container = NSPersistentContainer(name: "ContainerName")

    container.persistentStoreDescriptions = [persistentStoreDescription]

    container.loadPersistentStores { (_, error) in
        guard error == nil else { fatalError("Failed to load store:\(String(describing: error))") }
        DispatchQueue.main.async { completion(container) }
    }
}

但是,我收到以下错误:

  

CoreData:错误:尝试在路径中添加只读文件   文件:///私人的/ var /移动/容器/共享/ AppGroup / C9324B65B-265C-4264-95DE-B5AC5C9DAFD0 /   读/写。将其添加为只读。这将是一个很难的错误   未来;您必须指定NSReadOnlyPersistentStoreOption。

如果我像这样指定NSReadOnlyPersistentStoreOption:

persistentStoreDescription.isReadOnly = false

我收到错误:

  

无法加载存储:可选(错误域= NSCocoaErrorDomain代码= 513   "由于您没有权限,因此无法保存文件。"):

可能是什么原因和解决方案?

2 个答案:

答案 0 :(得分:1)

遇到同样的问题并通过添加

解决了这个问题
let directory = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.identifier")!
let url = directory.appendingPathComponent("MyDatabaseName.sqlite")

CoreData可能试图打开基本文件夹作为其sqlite数据库,但这并不是很好。

添加isReadOnly不允许CoreData重新使用文件夹:)

来源:https://github.com/maximbilan/iOS-Shared-CoreData-Storage-for-App-Groups

答案 1 :(得分:0)

  1. 在扩展程序的info.plist中设置:NSExtension-> NSExtensionAttributes-> RequestOpenAccess->是
  2. 在设备集的“设置”中:您的应用->(扩展名类型-例如:键盘)->允许完全访问权限