38

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

我在 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 子类?

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

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

4

1 回答 1

69

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

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

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

编辑:

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

1.确保你有你的应用和扩展目标

  1. 确保你有你的应用和扩展目标

    2. 单击您的模型文件,然后在右侧面板的“Target Membership”下选择两个目标

  2. 单击您的模型文件,然后在右侧面板的“目标成员资格”下选择两个目标

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

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

于 2014-08-20T15:16:27.630 回答