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

Posted

技术标签:

【中文标题】从小部件扩展访问核心数据【英文标题】:Access core data from widget extension 【发布时间】:2016-07-23 20:39:21 【问题描述】:

我正在尝试在今天的小部件扩展中读取核心数据属性。我在这里搜索了很多网站和问题,但我找不到解决方案!到目前为止,我将应用组添加到我的应用中,然后在 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 复制到新文件中。

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

在扩展 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")

【问题讨论】:

您是否遵循了所有必要的步骤?例如invasivecode.com/weblog/… @LorenzoBoaro 这是我见过的最愚蠢的教程!标题是关于核心数据和今天的扩展,但是当你遵循最后一步时!它说,核心数据并不总是好的!!!!!!!!!使用 NSUserDefualts !!!!!!!!!!!!!!! 【参考方案1】:

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

我通常使用一个名为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

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

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

【讨论】:

@Mc.Lover 很抱歉...我没有收到您的评论通知。确保您直接使用 CoreDataStack 类,而不是实例化它的实例。如果你粘贴你的班级并告诉我哪里出错了,我可能会在几分钟内提供帮助 还要确保你没有忘记每个静态变量声明末尾的 () 该类不是单例(尽管这是一个可能的解决方案)。你不用 CoreDataStack.defaultStack.managedObjectContext 访问它,你只需使用 CoreDataStack.managedObjectContext @Mc.Lover 如果你给我半个小时,我可以做一个示例项目。什么 Xcode 版本? @Mc.Lover 哇,太棒了! Xcode 7.3.1 ,Swift 2.2,以防我需要在小部件和手表应用程序扩展中使用该核心数据。非常感谢

以上是关于从小部件扩展访问核心数据的主要内容,如果未能解决你的问题,请参考以下文章

RUST + FLTK:从小部件 on_push() 函数访问另一个小部件

如何从小部件扩展导航到 UIKit viewController?

从小部件的父级访问坐标

试图从小部件访问状态,可能使用了错误的设计

在颤动中将数据从小部件发送到另一个小部件

WordPress:从小部件代码访问数据库