如何在today extension(iOS)中访问CoreData模型

如何在today extension(iOS)中访问CoreData模型,ios,core-data,swift,ios8,today-extension,Ios,Core Data,Swift,Ios8,Today Extension,在swift的今天扩展中是否可以像在原始应用程序中一样使用我的CoreData模型?如果是,如何创建NSManagedObjectContext 除了组标识符之外,我真的没有任何线索,但不幸的是,我不知道如何获取上下文 在过去,我创建应用程序时,在开始时检查我想使用CoreData,然后通过我的AppDelegate获得managedObjectContext。。但是我怎么能在扩展中做这样的事情呢?苹果没有提供这方面的信息 我在AppDelegate中编辑了这一行: NSURL *storeUR

在swift的今天扩展中是否可以像在原始应用程序中一样使用我的CoreData模型?如果是,如何创建NSManagedObjectContext
除了组标识符之外,我真的没有任何线索,但不幸的是,我不知道如何获取上下文
在过去,我创建应用程序时,在开始时检查我想使用CoreData,然后通过我的AppDelegate获得managedObjectContext。。但是我怎么能在扩展中做这样的事情呢?苹果没有提供这方面的信息

我在AppDelegate中编辑了这一行:

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"HTWcampus.sqlite"];
为此(将集团纳入两个目标后):

这样一来,我应用程序中现有的数据库就消失了(这很好,因为我认为将数据库放入共享部分是可行的)

但是如何在扩展中创建上下文的实例呢?如何访问我的NSManagedObject子类

到目前为止,在扩展中我有以下代码:

var context: NSManagedObjectContext!

override func viewDidLoad() {
    super.viewDidLoad()

    var storeURL = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.BenchR.TodayExtensionSharingDefaults")
    storeURL = storeURL?.URLByAppendingPathComponent("HTWcampus.sqlite")
    let modelURL = NSBundle.mainBundle().URLForResource("HTWcampus", withExtension: "momd")
    let model = NSManagedObjectModel(contentsOfURL: modelURL)
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: model)
    coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: nil)
    context = NSManagedObjectContext()
    context.persistentStoreCoordinator = coordinator
}

是这样吗?如果是的话,我怎样才能把我的NSManagedObject子类放在那里?我是否必须将momd文件添加到扩展名目标?如果是,我该怎么做?

您真正想要的是访问您的持久存储(很可能是SQLite数据库)。 为了实现这一点,您需要配置应用程序组,并确保您的主机应用程序使用共享容器配置核心数据堆栈(这样您的商店也可以在扩展中访问)。 比如:

    NSString *containerPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:YOUR_SECURITY_APP_GROUP].path;
    NSString *sqlitePath = [NSString stringWithFormat:@"%@/%@", containerPath, @"database.sqlite"];
然后,在扩展中,只需使用共享容器中的数据库创建具有托管对象上下文的持久存储协调器。 您可以通过扩展共享您的模型(.momd)和托管对象子类,只需确保它们也包含在扩展目标中

编辑:

要添加模型和托管对象子类,请执行以下操作:

  • 确保你有你的应用程序和扩展目标

  • 单击模型文件,并在右侧面板的“目标成员资格”下选择两个目标

  • 对所有托管对象子类重复相同的操作


  • 如何将模型(momd)包括在目标中?我甚至没有在应用程序targetI中看到它。我真的很想将您的答案标记为正确答案,请您更精确一点,好吗?谢谢您的精彩图片!在代码中,我得到了扩展名中带有NSBundle.mainBundle().URLForResource(“HTWcampus”,扩展名为“momd”)的模型,对吗?@KamilKocemba这看起来不错,但当扩展名和应用程序都尝试在同一个物理文件上读/写时,锁定会如何工作呢?谢谢!您还可以在本文中阅读如何配置
    应用程序组
        NSString *containerPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:YOUR_SECURITY_APP_GROUP].path;
        NSString *sqlitePath = [NSString stringWithFormat:@"%@/%@", containerPath, @"database.sqlite"];