如何在今天的扩展(iOS)中访问Core Data模型

时间:2014-08-20 14:31:11

标签: ios core-data swift ios8 today-extension

是否可以像在原始应用中那样在swift的今天扩展中使用我的CoreData模型?如果是,我该如何创建NSManagedObjectContext?
我真的不知道,除了组标识符,但不幸的是我不知道如何获取上下文..
过去我创建的应用程序一开始就检查我想要使用CoreData然后通过我的AppDelegate获得了managedObjectContext ..但是我怎么能在扩展中做那样的思考呢? Apple不提供有关该信息的信息..

我在AppDelegate中编辑了这一行:

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"HTWcampus.sqlite"];

到此(将组包括在两个目标之后):

NSURL *storeURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.BenchR.TodayExtensionSharingDefaults"];
storeURL = [storeURL URLByAppendingPathComponent:@"HTWcampus.sqlite"];
NSLog(@"StoreURL2: %@", storeURL);

因为我的应用程序中的现有数据库已经消失了(这很棒,因为我认为将数据库放在共享段中是有效的。)

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

在扩展程序中,到目前为止我有这个代码:

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-Subclasses?我是否必须将momd文件添加到扩展目标?如果是,我该怎么做?

1 个答案:

答案 0 :(得分:68)

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

    NSString *containerPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:YOUR_SECURITY_APP_GROUP].path;
    NSString *sqlitePath = [NSString stringWithFormat:@"%@/%@", containerPath, @"database.sqlite"];

然后在您的扩展中,使用共享容器中的数据库创建具有托管对象上下文的持久性存储协调器。 您可以通过确保它们也包含在扩展目标中来与扩展共享您的模型(.momd)和托管对象子类。

修改

添加模型和托管对象子类:

1. Make sure you have your app and extension targets

  1. 确保您拥有自己的应用和扩展目标

    2. Click on your model file, and select both targets under 'Target Membership' on right-hand panel

  2. 点击您的模型文件,然后在右侧面板上的“目标会员”下选择两个目标

    3. Repeat the same with all your managed object subclasses

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