从ios 10中的ios app widget扩展中的Coredata获取

Sha*_*sah 7 today-extension swift3 ios10

我试图从我的主应用程序的coredata数据库中获取实体,并在我的应用程序小部件Extention中显示它们.但是,fetch始终从我的数据库返回空结果.可以帮助我.Swift 3,ios 10.

Sha*_*sah 6

我解决了 创建应用程序组后,我创建了NSPersistentContainer的子类,并覆盖类方法defaultDirectory()以返回共享应用程序组目录.还要覆盖init(name:String,managedObjectModel model:NSManagedObjectModel).然后在coredata堆栈中,使用创建的PersistentContainer类的新实例替换样板persistentcontainer代码.

import UIKit
import CoreData
class PersistentContainer: NSPersistentContainer{
     override class func defaultDirectoryURL() -> URL{
    return FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.bundleId.SomeApp")!
}

override init(name: String, managedObjectModel model: NSManagedObjectModel) {
    super.init(name: name, managedObjectModel: model)
}
}
Run Code Online (Sandbox Code Playgroud)

然后在CoreDataStack Code*中的任何地方,可以在Appdelegate或其自己的文件中.我的文件名为CoredataStack

static var persistentContainer:PersistentContainer = {
    let container = PersistentContainer(name: "SomeApp", managedObjectModel: CoreDataStack.managedObjectModel)
    container.loadPersistentStores(completionHandler: { (storeDescription:NSPersistentStoreDescription, error:Error?) in
        if let error = error as NSError?{
            fatalError("UnResolved error \(error), \(error.userInfo)")
        }
    })

    return container
}()
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助

  • 你的方法有一些示例代码吗? (3认同)

Sha*_*ati -1

如今,扩展程序在与其包含的应用程序不同的进程中运行,因此不共享沙箱、用户默认值或表格数据库。这就是为什么当尝试从小部件获取容器中保存的数据时,您会得到一个空集。如果您希望包含的应用程序和小部件共享数据,您应该通过 iOS 开发人员门户向您的应用程序添加“应用程序组”功能,并为其提供共享组标识符字符串。接下来,当您实例化数据库(或 UserDefaults)的 FileManager 对象时,必须使用 initWithSuiteName 方法,传入共享组的标识符。