【问题标题】: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 !!!!!!!!!!!!!!!

标签: ios iphone swift core-data


【解决方案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,以防我需要在小部件和手表应用程序扩展中使用该核心数据。非常感谢
猜你喜欢
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 2017-05-31
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 2019-03-20
相关资源
最近更新 更多