我试图从我的主应用程序的coredata数据库中获取实体,并在我的应用程序小部件Extention中显示它们。但是,fetch始终从我的数据库返回空结果。可以帮助我。 Swift 3,ios 10。
答案 0 :(得分:6)
我解决了。创建应用程序组后,我创建了NSPersistentContainer的子类,并覆盖类方法defaultDirectory()以返回共享应用程序组目录。还要覆盖init(name:String,managedObjectModel model:NSManagedObjectModel)。然后在coredata堆栈中,使用创建的PersistentContainer类的新实例替换样板persistentCatiner代码。
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)
}
}
然后在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
}()
希望这会有所帮助
答案 1 :(得分:0)
今天,Extension与其包含的app在不同的进程中运行,因此不共享沙箱,UserDefaults或数据库tabled。这就是为什么在尝试从小部件中获取保存在容器中的数据时获得空集的原因。 如果您希望包含应用程序和小部件共享数据,则应通过iOS开发人员门户向应用程序添加“应用程序组”功能,并为其提供共享组标识符字符串。 接下来,当您为数据库(或UserDefaults)实例化FileManager对象时,必须使用initWithSuiteName方法,传入共享组的标识符。