从小部件扩展访问核心数据

时间:2016-07-23 20:39:22

标签: ios iphone swift core-data

我正在尝试阅读今日小部件扩展中的核心数据属性。我在这里搜索了很多网站和问题,但我找不到解决方案!到目前为止,我已将应用组添加到我的应用中,然后在App Delegate中更改此行:

lazy var applicationDocumentsDirectory: NSURL = {
    // file. This code uses a directory named "compony.AppName" in the application's documents Application Support directory.
    let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
    return urls[urls.count-1]
}()

到:

lazy var applicationDocumentsDirectory: NSURL? = {
    return NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.myDomain.appgroupID") ?? nil
}()

那么下一步是什么?如何从小部件中心访问上下文实体等?如果有人帮助我,我将不胜感激。

我只有一个entity有几个attributes

修改

  • 我创建了一个CoreDataStack.swift并将所有核心数据文件从AppDelegate复制到新文件中。

  • 将我的数据模型添加到小部件扩展程序:

enter image description here

  • 在扩展程序viewDidLoad中,我厌倦了从模型中检索数据但在运行窗口小部件时没有任何反应:

     context  = CoreDataStack.defaultStack.managedObjectContext
    
    do {
    
        request = NSFetchRequest(entityName: "Event")
        results = try context.executeFetchRequest(request)
        print(results.count)
    
        if results.count > 0 {
    
            for item in results as! [NSManagedObject] {
    
                let name = item.valueForKey("title")
    
                print(name!)
            }
    
        }//end if
    
    
    } catch {
    
        print("there is an error for saving")
    }
    

1 个答案:

答案 0 :(得分:6)

由于小部件没有应用程序委托,您可能希望将核心数据堆栈代码移出主应用程序中的应用程序委托类。

我通常使用名为CoreDataStack的类。只需将所有方法复制到此新类中,将lazy更改为static

class CoreDataStack {
    static var applicationDocumentsDirectory: NSURL? = { ... }()
    static var managedObjectModel: NSManagedObjectModel = { ... }()
    static var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { ... }()
    static var managedObjectContext: NSManagedObjectContext? = { ... }()
}

由于这些是static个变量,您可以使用以下语法访问托管上下文:

let ctx = CoreDataStack.managedObjectContext

...而不是通过您的应用代表进行的典型访问。

您应该使用“目标成员资格”下的右侧边栏将此文件添加到主应用程序目标和窗口小部件目标。这样,您将在两个位置以相同的方式访问Core Data堆栈。您需要对所有模型执行相同操作,以确保它们在扩展中可用。