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

Ben*_*Ben 37 core-data ios swift ios8 today-extension

是否可以像在原始应用程序中那样在swift的今天扩展中使用我的CoreData模型?如果是,我该如何创建NSManagedObjectContext?
我真的不知道,除了group-identifier之外,但不幸的是我不知道如何获取上下文..
过去我创建的应用程序在开头检查我想要使用CoreData然后我得到了managedObjectContext通过我的AppDelegate ..但我怎么能在扩展中做那样的想法?Apple不提供相关信息..

我在AppDelegate中编辑了这一行:

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"HTWcampus.sqlite"];
Run Code Online (Sandbox Code Playgroud)

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

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

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

但是如何在扩展中创建我的上下文实例?我怎样才能访问我的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
}
Run Code Online (Sandbox Code Playgroud)

这是正确的吗?如果是的话,我怎样才能获得我的NSManagedObject-Subclasses?我是否必须将momd文件添加到扩展目标?如果是的话,我该怎么做?

kko*_*dev 69

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

    NSString *containerPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:YOUR_SECURITY_APP_GROUP].path;
    NSString *sqlitePath = [NSString stringWithFormat:@"%@/%@", containerPath, @"database.sqlite"];
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

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

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

    2.单击您的模型文件,然后在右侧面板上的

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

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

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

  • @KamilKocemba这看起来和工作正常,但当扩展和应用程序都尝试在同一物理文件上读/写时,锁定工作将如何. (7认同)